亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++快速排序的分析與優化詳解

2020-01-26 15:24:33
字體:
來源:轉載
供稿:網友

相信學過數據結構與算法的朋友對于快速排序應該并不陌生,本文就以實例講述了C++快速排序的分析與優化,對于C++算法的設計有很好的借鑒價值。具體分析如下:

一、快速排序的介紹

快速排序是一種排序算法,對包含n個數的輸入數組,最壞的情況運行時間為Θ(n2)[Θ 讀作theta]。雖然這個最壞情況的運行時間比較差,但快速排序通常是用于排序的最佳的實用選擇。這是因為其平均情況下的性能相當好:期望的運行時間為 Θ(nlgn),且Θ(nlgn)記號中隱含的常數因子很小。另外,它還能夠進行就地排序,在虛擬內存環境中也能很好的工作。

和歸并排序一樣,快速排序也是基于分治法(Divide and conquer):

分解:數組A[p..r]被劃分成兩個(可能為空)的子數組A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每個元素都小于等于A[q],A[q+1..r]中的每個元素都大于等于A[q]。這樣元素A[q]就位于其最終位置上了。

解決:通過遞歸調用快速排序,對子數組A[p..q-1]和A[q+1..r]排序。

合并:因為兩個子數組是就地排序,不需要合并,整個數組已有序。

偽代碼如下:

PARTITION(A, p, r)   x = A[p]   i = p   for j=p+1 to r     do if A[j] <= x       then i = i+1          exchange(A[i],A[j])   exchange(A[p], A[i])   return i  QUICKSORT(A, p, r)   if p < r     then q = PARTITION(A, p, r)        QUICKSORT(A, p, q-1)        QUICKSORT(A, q+1, r) 

二、性能分析

1、最壞情況

快速排序的最壞情況發生在當數組已經有序或者逆序排好的情況下。這樣的話劃分過程產生的兩個區域中有一個沒有元素,另一個包含n-1個元素。此時算法的運行時間可以遞歸地表示為:T(n) = T(n-1)+T(0)+Θ(n),遞歸式的解為T(n)=Θ(n^2)??梢钥闯?,快速排序算法最壞情況運行時間并不比插入排序的更好。

2、最好情況

如果我們足夠幸運,在每次劃分操作中做到最平衡的劃分,即將數組劃分為n/2:n/2。此時得到的遞歸式為T(n) = 2T(n/2)+Θ(n),根據主定理的情況二可得T(n)=Θ(nlgn)。

3、平均情況

假設一:快排中的劃分點非常偏斜,比如每次都將數組劃分為1/10 : 9/10的兩個子區域,這種情況下運行時間是多少呢?運行時間遞歸式為T(n) = T(n/10)+T(9n/10)+Θ(n),使用遞歸樹解得T(n)=Θ(nlgn)??梢钥闯?,當劃分點非常偏斜的時候,運行時間仍然是Θ(nlgn)。

假設二:Partition所產生的劃分既有“好的”,也有“差的”,它們交替出現。這種平均情況下運行時間又是多少呢?這時的遞歸式為(G表示Good,B表示Bad):

G(n) = 2B(n/2) + Θ(n)

B(n) = G(n-1) + Θ(n)

解:G(n) = 2(G(n/2-1) + Θ(n/2)) + Θ(n) = 2G(n/2-1) + Θ(n) = Θ(nlgn)

可以看出,當好、差劃分交替出現時,快排的運行時間就如全是好的劃分一樣,仍然是Θ(nlgn) 。

三、快排的優化

經過上面的分析可以知道,在輸入有序或逆序時快速排序很慢,在其余情況則表現良好。如果輸入本身已被排序,那么就糟了。那么我們如何確保對于所有輸 入,它均能夠獲得較好的平均情況性能呢?前面的快速排序我們默認使用數組中第一個元素作為主元。假設隨機選擇數組中的元素作為主元,則快排的運行時間將不 依賴于輸入序列的順序。我們把隨機選擇主元的快速排序叫做Randomized Quicksort。

在隨機化的快速排序中,我們不是始終選擇第一個元素作為主元,而是從數組A[p…r]中隨機選擇一個元素,然后將其與第一個元素交換。由于主元元素是隨機選擇的,我們期望在平均情況下,對輸入數組的劃分能夠比較對稱。

偽代碼如下:

RANDOMIZED-PARTITION(A, p, r)   i = RANDOM(p, r)   exchange(A[p], A[i])   return PARTITION(A, p, r)  RANDOMIZED-QUICKSORT(A, p, r)   if p < r     then q = RANDOMIZED-PARTITION(A, p, r)       RANDOMIZED-QUICKSORT(A, p, q-1)       RANDOMIZED-QUICKSORT(A, q+1, r) 

我們對3萬個元素的有序序列分別進行傳統的快速排序 和 隨機化的快速排序,并比較它們的運行時間:

/*************************************************************************   > File Name: QuickSort.cpp   > Author: SongLee  ************************************************************************/ #include<iostream> #include<cstdlib> // srand rand #include<ctime> // clock_t clock using namespace std;  void swap(int &a, int &b) {   int tmp = a;   a = b;   b = tmp; }  // 傳統劃分操作 int Partition(int A[], int low, int high) {   int pivot = A[low];   int i = low;   for(int j=low+1; j<=high; ++j)   {     if(A[j] <= pivot)     {       ++i;       swap(A[i], A[j]);     }   }   swap(A[i], A[low]);   return i; }  // 隨機化劃分操作,隨機選擇pivot int Partition_Random(int A[], int low, int high) {   srand(time(NULL));   int i = rand() % (high+1);   swap(A[low], A[i]);   return Partition(A, low, high); }  // 傳統快排 void QuickSort(int A[], int low, int high) {   if(low < high)   {     int pos = Partition(A, low, high);     QuickSort(A, low, pos-1);     QuickSort(A, pos+1, high);   } }  // 隨機化快速排序 void QuickSort_Random(int A[], int low, int high) {   if(low < high)   {     int pos = Partition_Random(A, low, high);     QuickSort_Random(A, low, pos-1);     QuickSort_Random(A, pos+1, high);   } }  int main() {   clock_t t1, t2;   // 初始化數組   int A[30000];   for(int i=0; i<30000; ++i)     A[i] = i+1;        t1 = clock();   QuickSort(A, 0, 30000-1);   t1 = clock() - t1;   cout << "Traditional quicksort took "<< t1 << " clicks(about " << ((float)t1)/CLOCKS_PER_SEC << " seconds)." << endl;    t2 = clock();   QuickSort_Random(A, 0, 30000-1);   t2 = clock() - t2;   cout << "Randomized quicksort took "<< t2 << " clicks(about " << ((float)t2)/CLOCKS_PER_SEC << " seconds)." << endl;    return 0; }

運行結果如下:

[songlee@localhost ~]$ ./QuickSort  Traditional quicksort took 1210309 clicks(about 1.21031 seconds). Randomized quicksort took 457573 clicks(about 0.457573 seconds). [songlee@localhost ~]$ ./QuickSort  Traditional quicksort took 1208038 clicks(about 1.20804 seconds). Randomized quicksort took 644950 clicks(about 0.64495 seconds). 

從運行結果可以看出,對于有序的輸入,隨機化版本的快速排序的效率會高很多。

問題記錄:

我們知道交換兩個變量的值有以下三種方法:

int tmp = a; // 方法一 a = b; b = tmp  a = a+b; // 方法二 b = a-b; a = a-b;  a = a^b; // 方法三 b = a^b; a = a^b;

但是你會發現在本程序中,如果swap函數使用后面兩種方法會出錯。由于方法二和方法三沒有使用中間變量,它們交換值的原理是直接對變量的內存單元進行操作。如果兩個變量對應的同一內存單元,則經過兩次加減或異或操作,內存單元的值已經變為了0,因而不能實現變量值交換。所以當需要交換值的變量可能是同一變量時,必須使用第三變量實現交換,否則會對變量清零。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人av在线| 国产日韩欧美日韩大片| 91精品国产高清久久久久久| 亚洲色图50p| 精品亚洲一区二区三区四区五区| 日本成人激情视频| 欧美激情一级二级| 亚洲色图18p| 日韩中文在线中文网三级| 精品成人国产在线观看男人呻吟| 欧美在线不卡区| 中文字幕一精品亚洲无线一区| 最近2019中文字幕mv免费看| 青青久久av北条麻妃海外网| 91精品久久久久久久久中文字幕| 另类色图亚洲色图| 菠萝蜜影院一区二区免费| 69视频在线播放| 欧美激情手机在线视频| 久久成人亚洲精品| 久久五月天色综合| 97色在线观看免费视频| 国产视频久久久| 亚洲在线免费看| 欧美特黄级在线| 青青久久av北条麻妃黑人| 久久视频在线直播| 亚洲第一中文字幕在线观看| 欧美在线观看视频| 精品亚洲一区二区| 中文字幕精品www乱入免费视频| 九九久久综合网站| 一本大道香蕉久在线播放29| 欧美黄色小视频| 狠狠色狠色综合曰曰| 精品少妇v888av| 亚洲午夜激情免费视频| 亚洲曰本av电影| 亚洲精品videossex少妇| 国产成人自拍视频在线观看| 成人xvideos免费视频| 国产午夜精品视频免费不卡69堂| 91麻豆国产精品| 久久久91精品| 日韩免费中文字幕| 亚洲人成网站免费播放| 国产99在线|中文| 国产亚洲精品激情久久| 亚洲高清福利视频| 92看片淫黄大片欧美看国产片| 欧美性在线观看| 免费不卡欧美自拍视频| 国产丝袜精品第一页| 欧美亚洲国产日韩2020| 97久久精品人人澡人人爽缅北| 久久免费少妇高潮久久精品99| 欧美成年人网站| 国产精品美乳在线观看| 久久国产精品久久久久久久久久| 欧美日韩国产专区| 夜夜狂射影院欧美极品| 成人h片在线播放免费网站| 国产精品看片资源| 超碰91人人草人人干| 91精品国产91| 国产精品尤物福利片在线观看| 国产精品三级久久久久久电影| 中文字幕一区日韩电影| 精品色蜜蜜精品视频在线观看| 国产精品视频最多的网站| 国产美女直播视频一区| 最近2019年好看中文字幕视频| 欧美激情一区二区三区在线视频观看| 国产精品久久久久国产a级| 日韩中文在线中文网三级| 欧美国产日韩精品| 国产日韩视频在线观看| 日韩精品福利网站| 国产成人精品国内自产拍免费看| 中文字幕日韩电影| 97香蕉超级碰碰久久免费的优势| 亚洲欧美精品伊人久久| 欧美肥婆姓交大片| 国产精品91在线| 国产日韩av在线| 色综合色综合久久综合频道88| 91夜夜揉人人捏人人添红杏| 成人国产在线视频| 91免费在线视频网站| 国产精品午夜一区二区欲梦| 精品国产精品三级精品av网址| 国内精品久久久久久影视8| 亚洲bt欧美bt日本bt| 国产精品久久久久999| 91理论片午午论夜理片久久| 国产在线视频一区| 国产精品精品视频一区二区三区| 日韩av网址在线| 日韩在线欧美在线国产在线| 亚洲国产成人精品电影| 精品视频在线播放色网色视频| 日本精品va在线观看| 国产婷婷色综合av蜜臀av| 欧美肥婆姓交大片| 91性高湖久久久久久久久_久久99| 一区二区欧美日韩视频| 欧美成人免费va影院高清| 日韩一区二区三区在线播放| 国产91精品网站| 91wwwcom在线观看| 国产精品都在这里| 日韩高清电影免费观看完整| 欧美一级电影久久| 亚洲毛片在线免费观看| 久久亚洲综合国产精品99麻豆精品福利| 国产精品香蕉在线观看| 91精品中国老女人| 92福利视频午夜1000合集在线观看| 91久久久久久久一区二区| 国产成人在线一区| 国产精品久久久久久五月尺| 久久av红桃一区二区小说| 欧洲成人午夜免费大片| 26uuu亚洲国产精品| 久久久久中文字幕| 自拍偷拍亚洲欧美| 国产精品wwwwww| 亚洲国产又黄又爽女人高潮的| 国语自产精品视频在线看| 亚洲最新av在线网站| 911国产网站尤物在线观看| 色噜噜亚洲精品中文字幕| 国产在线观看精品一区二区三区| 久久久久久久久久久久av| 国产精品视频一区二区高潮| 日本高清不卡的在线| 久久人人爽人人爽人人片av高清| 国产精品日韩一区| 亚洲精品日韩欧美| 日韩动漫免费观看电视剧高清| 2019国产精品自在线拍国产不卡| 日韩精品www| 亚洲欧美制服第一页| 精品无人区乱码1区2区3区在线| 欧美大肥婆大肥bbbbb| 高清视频欧美一级| 亚洲美女精品久久| 亚洲综合精品伊人久久| 6080yy精品一区二区三区| 成人性生交大片免费看视频直播| 一区二区三区无码高清视频| 中国日韩欧美久久久久久久久| 久久久精品一区二区三区| 日本高清不卡的在线| 精品国产福利视频| xxx一区二区| 亚洲性av在线| 亚洲r级在线观看| 国产精品69精品一区二区三区| 91大神福利视频在线| 亚洲精品免费一区二区三区| 国产欧美一区二区三区四区| 欧美在线视频a| 亚洲石原莉奈一区二区在线观看|