快速排序

 先瞟一眼代码:

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的时间,)。

所以我们可以不用字段的第一个元素作为基准,而是随机选取字段中的任一元素来作为基准。就是这样的。

posted @ 2016-12-04 21:23  郑龙天  阅读(181)  评论(0)    收藏  举报