算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧
教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧:
http://blog.csdn.net/morewindows/article/details/6684558 感谢博主。
四种排序算法的比较
冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。
插入排序通过将序列中的值插入一个已经排好序的序列中,直到该序列结束。插入排序是对冒泡排序的改进。它比冒泡排序快两倍。一般不用在数据的值大于 1000 的场合,或数据的个数超过 200 的序列。
选择排序在实际应用中处于与冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。但是它们最好理解。
快速排序是大规模递归的算法,它比大部分排序算法都要快。一般用于数据个数比较多的情况。尽管可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。
#include <stdio.h> #include <stdlib.h> /* 快速排序算法学习 */ void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void quickSort(int arr[] ,int start, int end) { int arrBase, arrMiddle; int tempStart = start, tempEnd = end; //对于这种递归的函数,内部必须要有一个函数返回的条件 if(tempStart >= tempEnd) return; //拷贝一个基准值作为后面比较的参数 arrBase = arr[start]; while(start < end) { while(start < end && arr[end] > arrBase) end--; if(start < end) { swap(&arr[start], &arr[end]); start++; } while(start < end && arr[start] < arrBase) start++; if(start < end) { swap(&arr[start], &arr[end]); end--; } } arr[start] = arrBase; arrMiddle = start; //分治方法进行递归 quickSort(arr,tempStart,arrMiddle-1); quickSort(arr,arrMiddle+1,tempEnd); } int main() { int myArr[] = {12,13,15,20,0,-1,-10,100}; int arrLength = sizeof(myArr)/sizeof(int); quickSort(myArr,0,arrLength-1); for(int i = 0; i<arrLength; i++) printf("%5d",myArr[i]); return 0; }
虽千万里,吾往矣。