首页 > 代码库 > 快速排序

快速排序

算法描述   分而治之

技术分享

过程1:以65为主元,将小于65的为一组放在65左边。大于65的为一组放在65右边。  排序后: {左边}  主元(65) {右边}

 

递归的进行。在左边这一组选一个主元,重复上过程1。右边这一组选一个主,重复过程1。

 

直到左边右边都只有一个元素。

对于小规模数据,用递归并不划算,小规模数据我们用简单排序。

设定阈值,当数据规模小于阈值时,简单排序。大于阈值,分而治之。

 1 int Median3(ElementType A[],int Left,int Right)// 选主元。 2 {  3     int center; 4     center=(Left+Right)/2; 5     if(A[Left]>A[center]) 6         Swap(A+Left,A+center); 7     if(A[Left]>A[Right]) 8         Swap(A+Left,A+Right); 9     if(A[center]>A[Right])10         Swap(A+center,A+Right);11     Swap(A+center,A+Right-1);12     return A[Right-1];//把主y元放在r-1的位置,这样left,r-1,right都是有序的,排序的时候只需从l+1,到r-2。13 14 }15 void Quicksort(ElementType A[] ,int Left,int Right)16 {17     int pivot,k,i,j,cutoff;18     cutoff=50;19     20     if(Right-Left>cutoff)    //小于阈值,快速排序,小规模排序,递归21     {22         pivot=Median3(A,Left,Right);23         i=Left;   //排序的时候只需从l+1,到r-2。24         j=Right-1;25         while(1)26         {27             while(A[++i]<pivot);28             while(A[--j]>pivot);  //超级错误29             if (i<j)30                 Swap(A+j,A+i);31             else break;32          33         }34         Swap(A+i,A+Right-1);35         Quicksort(A,Left,i-1);36         Quicksort(A,i+1,Right);37     38     }39     else40     {41         //简单排序42         Insertion_sort( A,  Right-Left);43     }44 }45 void Quick_Sort(ElementType A[],int N)46 {47     Quicksort(A,0,N-1);48 }

错误分析:

1. 28行   --j不要写成++j,j是高位,从右往左移动

2. 22行     pivot  不要写在if的外面,只有快速排序的时候才会用pivot

快速排序