快速排序
先瞟一眼代码:
void QuickSort(int a[],int p,int r)
{
if(p<r)
{
int q=partiton(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
void partition(int a[],int p,int r) { int x=a[p]; int i=0,j=r+1; while(true) { while(a[++i]<x&&i<r);//i遇到第一个比x大的 while(a[--j]>x); //j遇到第一个比x小的 if(i>=j) break; swap(a[i],a[j]); } a[p]=a[j]; a[j]=x; //这里不用swap是因为swap要三行代码 return j;//即下标q }
(1)分解:以a[p]为基准,将数组 a[p:r] 分成三段a[p:q-1],a[q],a[q+1:r],下标q在分解过程中确定;
(2)递归:用递归分别对a[p:q-1] 和 a[q+1:r] 进行分解;
(3)合并:因为数组中的元素在 分解 过程中已经排好序了,因此不需要任何计算,就已排好序了
分解的过程如图:

但是这样的话,在最坏的情况下,如:已经由小到大排好序了,那这时就要耗费 n^2 的时间来排序(这种情况下每次分解会产生长度为1和n-1的两个字段,这样需要n次的分解,二每次分解的过程固定需要n的时间,)。
所以我们可以不用字段的第一个元素作为基准,而是随机选取字段中的任一元素来作为基准。就是这样的。

浙公网安备 33010602011771号