第七章快速排序之“採取“尾遞迴”和“三數取中”技術的快速排序”(思考題7-4、7-5)

來源:互聯網
上載者:User

QUICKSORT演算法包含兩個對其自身的遞迴調用,即調用PARTITION後,左邊的子數組和右邊的子數組分別被遞迴排序。QUICKSORT中的第二次遞迴調用並不是必須的,可以用迭代控制結構來代替它,這種技術叫做“尾遞迴”,大多數的編譯器也使用了這項技術。最壞的情況下,就是劃分不好的時候,遞迴深度為O(n),能夠二分的話遞迴深度為O(lgn),但是怎麼才能得到好的劃分呢?前面在快速排序中用了個隨機化技術,“三數取中”能夠讓隨機化更加理想。有這兩項技術護體,快速排序不管在時間複雜度還是空間複雜度上都能得到最佳化。所謂“三數取中”是指,從子數組中隨機選出三個元素,取其中間數作為主元,這算是前面隨機化版本的升級版,即使是升級版,也只能影響快速排序時間複雜度O(nlgn)的常數因子。

代碼如下:

#include <string.h>#include <time.h>#define BUFFER_SIZE 10int Partition(int *a,int p,int r){int tmp=0;int i=0;int j=0;i=p-1;for(j=p;j<r;j++){if(a[j]<=a[r]){i++;tmp=a[i];a[i]=a[j];a[j]=tmp;}}tmp=a[i+1];a[i+1]=a[r];a[r]=tmp;return i+1;}int RandomPartition(int *a,int p,int r){int min=0;int mid=0;int max=0;int i=0;int j=0;int k=0;int tmp=0;srand((unsigned)time(NULL));i=rand()%(r-p+1)+p;j=rand()%(r-p+1)+p;k=rand()%(r-p+1)+p;min=a[i];mid=a[j];max=a[k];min=(min<mid)?min:mid;mid=(mid<max)?mid:max;mid=(mid>min)?mid:min;if(a[i]==mid){tmp=a[i];a[i]=a[r];a[r]=tmp;}else if(a[j]==mid){tmp=a[j];a[j]=a[r];a[r]=tmp;}else if(a[k]==mid){tmp=a[k];a[k]=a[r];a[r]=tmp;}return Partition(a,p,r);}void QuickSort(int *a,int p,int r){int q=0;while(p<r)//直到把右半邊數組劃分成最多隻有一個元素為止,就排完了!不能用if哦,用if的話,右半邊數組就只被劃分一次。{q=RandomPartition(a,p,r);QuickSort(a,p,q-1);p=q+1;}}int main(){int i=0;int j=0;int a[BUFFER_SIZE]; //隨機產生數組 srand((unsigned)time(NULL));for(j=0;j<BUFFER_SIZE;j++){a[j]=rand()%100;} printf("隨機產生的數組:\n");for(i=0;i<BUFFER_SIZE;i++){printf("%d ",a[i]);} printf("\n");QuickSort(a,0,BUFFER_SIZE-1);printf("對數組進行快速排序:\n"); for(i=0;i<BUFFER_SIZE;i++){printf("%d ",a[i]);}system("pause");return 0;} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.