读书日记-快速排序算法

性能

  快速排序的最坏时间为O(n2),平均时间复杂度为O(nlgn)。

算法导论对快速排序的描述是:

  分解:数组A[p..r] 被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..p-1]的每个元素小于等于A[q],而A[q]也小于等于[q+q..r]中的每个元素。

  解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。

  合并:因为子数组都是原址排序,所以不需要合并操作:数组A[p..r]已经有序。

即,利用分治思想对数组A[p..r]进行划分成子数组A[p..q-1]和A[q+1..r],

  且通过与基数比较使得A[p..q-1]小于基数,A[q+1 ..r] 大于基数,

  直至子数组中元素个数为1,则完成快速排序。

 

简单例子,对下列数组进行快速排序:

96 20 60 33 72 2 42 57 22 50

以最后一个元素为基数则排序如下,    表示q指示的位置,      表示当前比较到的位置,     表示与q交换后的位置 

  ->   96 20 60 33 72 02 42 57  22 50    从 第一个元素开始比较,  96大于50  此时没有移动    q = 0   ->   20 96 60 33 72 02 42 57  22 50    从 第一个元素开始比较,20小于50往前移。 20与q上的数字90交换,交换后q=1
  ->   20 96 60 33 72 02 42 57  22 50
  ->   20 33 60 96 72 02 42 57  22 50
  ->   20 33 60 96 72 02 42 57  22 50
  ->   20 33 02 96 72 60 42 57  22 50
  ->   20 33 02 42 72 60 96 57  22 50
  ->   20 33 02 42 72 60 96 57  22 50
  ->   20 33 02 42 22 60 96 57  72 50
  ->   20 33 02 42 22 50 96 57  72 60


这样 0-5 小于50 ,6-9大于50。

分成如下2个数组

A[p .. q-1] 数组如下

20 33 02 42 22 50

A[q+1 .. r] 数组如下

92 56 72 60

分别对2个数组继续分解划分即可完成排序

 

代码如下:

int Partition(int* A,int p,int r)
{
     int x = A[r];   // 基数
     int  q =p;
     for(int j=p;j<r;++j)
     {
           if(A[j] <=x)
           {
                int temp = A[q];
                A[q]  = A[j];
                A[j]    =temp;
                 ++q;
             }
        }
        q=(q-1<p)?p:q-1;
       return q;
}
    

//  快速排序
void Quicksort(int* A,int p,int r)
{
   if(p<r)
    {  
         int  q = Partition(A,p,r);
         Quicksort(A,p,q-1);
         Quicksort(A,p+1,r);
     }
}

 

posted @ 2015-12-08 00:04  稀饭lei___  阅读(254)  评论(0编辑  收藏  举报