这个排序方法的时间复杂度为O(nlogn),最坏时间复杂度为O(n^2),所以说是属于所有排序方法中比较高效率的一种了。
这种排序方法的基本思想是:
先找到一个区间中的一个基准点,然后找到这个区间右边所有小于这个基准点的元素都放到基准点左边,还有这个区间左边所有左边大于这个基准点的元素都放到基准点右边。用递归思想,将区间化小,一直小到只有一个元素即排序完成。
百度百科这么说的:快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
该思想的实现代码写出来可能不一样,但是思想大概就是这个思想。
下面是我搜集到的一个人写的快速排序的代码:
1 void partition(int a[], int start,int end) 2 { 3 if(start>=end) 4 return; 5 6 int low = start; 7 int heigh = end; 8 int index = a[low]; // 基准点选在区间开头的元素 9 10 while(low<heigh) 11 { 12 while(a[heigh]>index&&low<heigh) // 从区间右侧开始,找到比基准点index小的元素就放到区间左边 13 { 14 heigh--; 15 } 16 if(low<heigh) 17 { 18 a[low++] = a[heigh]; 19 } 20 while(a[low]<index&&low<heigh) // 从区间左边开始,找到比基准点index大的元素就放到区间右边 21 { 22 low++; 23 } 24 if(low<heigh) 25 { 26 a[heigh--] = a[low]; 27 } 28 } 29 30 a[low] = index; // 把基准点放到区间中间 31 partition(a,start,low-1); // 把基准点左侧的区间进行整理----递归 32 partition(a,low+1,end); // 把基准点右侧的区间进行整理----递归 33 }
下面是调用示例:
int a[] = {1,3,5,4,3,0,8,6}; partition(a,0,7);
运行结果:
参考文章: