快速排序是真的块。
简单的说一下快排的思想:
第一步,找出一个键值,通常取第一个元素,用temp中间变量暂存,left和right为排序范围的左边界和右边界。
第二步、从右边找出比temp小的放入i下标的位置。i++。
第三步、从i+1的位置往后找到比temp大的值放入j下标处。
第四步、知道i >=j..
第一次排序做好了,然后重复步骤。。排序left到j - 1,i+1 到right。
void quickSort(int a[],int left,int right)
{
int i = left;
int j = right;
int temp = a[left];
if(i >= j ) //说明不需要排序了
return;
while(i != j)
{
while(i < j && a[j] >= temp)//寻找比temp小的值
j--;
if(i < j)
a[i] = a[j];//把小的值放入
while(i < j && a[i] <= temp)//寻找比temp大的值
i++;
if(i < j)
a[j] = a[i];
}
a[i] = temp;
quickSort(a,left,j-1);
quickSort(a,i+1,rigth);
}
快速排序具有最好的平均性能(average behavior),但最坏性能(worst case behavior)和插入排序相同,也是O(n^2)。比如一个序列5,4,3,2,1,要排为1,2,3,4,5。按照快速排序方法,每次只会有一个数据进入正确顺序,不能把数据分成大小相当的两份,很明显,排序的过程就成了一个歪脖子树,树的深度为n,那时间复杂度就成了O(n^2)。尽管如此,需要排序的情况几乎都是乱序的,自然性能就保证了。据书上的测试图来看,在数据量小于20的时候,插入排序具有最好的性能。当大于20时,快速排序具有最好的性能,归并(merge sort)和堆排序(heap sort)也望尘莫及,尽管复杂度都为nlog2(n)。