快速排序在多核中提高效率

2021-04-13 13:12:29 字數 3190 閱讀 7301

剛剛從網上找了乙個快速排序的例項,拿出來跟大家共享一下。這是乙個簡單的程式,在演算法中,效率是很重要的。

在多核的平台下,如果提高下面這個快速排序的效率,大家可以共同討論討論。發表自己觀點

例項說明

用快速排序的方法對陣列進行排序 .

例項解析

快速排序 (quicksort)

快速排序是一種劃分交換排序 . 它採用了一種分治的策略 , 通常稱其為分治法 (divide-and-conquermethod) 。

(1) 分治法的基本思想,將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

(2) 快速排序的基本思想

設當前待排序的無序區為 r[low..high], 利用分治法的基本思想如下。

① 分解。在 r[low..high] 中任選乙個記錄作為基準 (pivot), 以此基準將當前無序區劃分為左、右兩個較小的子區間 r[low..pivotpos-1] 和 r[pivotpos+1..high], 並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄 ( 不妨記為 pivot) 的關鍵字 pivot.key, 右邊的子區間中所有記錄的關鍵字均大於等於 pivot.key, 而基準記錄 pivot 則位於正確的位置 (pivotpos) 上,無需參加後續的排序。

劃分的關鍵是要求出基準記錄所在的位置 pivotpos 。劃分的結果可以簡單地表示為 ( 注意 pivot=r[pivotpos]):r[low..pivotpos-1].keys <=r[pivotpos].key <=r[pivotpos+1..high].keys, 其中 low <=pivotpos <=high 。

② 求解。通過遞迴呼叫快速排序對左、右子區間 r[low..pivotpos-1] 和 r[pivotpos+1..high] 快速排序。

③ 組合。因為當「求解」步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,「組合」步驟無需做什麼,可看作是空操作。

快速排序演算法

void quicksort(seqlist r,int low,int high)//endwhile

r[i]=pivot; // 基準記錄已被最後定位

return i;

}//partition

程式**—快速排序

#include 

#define max 255

int r[max];

int partition(int i,int j)/*endwhile*/

r[i]=pivot; /* 基準記錄已被最後定位 */

return i;

}/*end of partition*/

void quick_sort(int low,int high)

puts(「please input the elements one by one:」);

for(i=1;i <=n;i++)

scanf(「%d」,&r[i]);

puts(「the sequence you input is:」);

for(i=1;i <=n;i++)

printf(「%4d」,r[i]);

quick_sort(1,n);

puts(「/nthe sequence after quick_sort is:」);

for(i=1;i <=n;i++)

printf(「%4d」,r[i]);

puts(「/n press any key to quit..」);

getch();

} 歸納注釋

快速排序的時間主要耗費在劃分操作上,對長度為 k 的區間進行劃分,共需 k-1 次關鍵字的比較。

最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。因此,快速排序必須做 n-1 次劃分,第 i 次劃分開始時區間長度為 n-i-1, 所需的比較次數為 n-i(1 <=i <=n-1), 故總的比較次數達到最大值 c max =n(n-1)/2=o(n 2 ) 。如果按上面給出的劃分演算法,每次取當前無序區的第 1 個記錄為基準,那麼當檔案的記錄已按遞增序(或遞減序)排列時,每次劃分所取的基準就是當前無序區中關鍵字最小(或最大)的記錄,則快速排序所需的比較次數反而最多。

最好時間複雜度:在最好情況下,每次劃分所取的基準都是當前無序區的「中值」記錄,劃分的結果與基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數為 o(nlgn) 。

用遞迴樹來分析最好情況下的比較次數更簡單。因為每次劃分後左、右子區間長度大致相等,故遞迴樹的高度為 o(lgn), 而遞迴樹每一層上各結點所對應的劃分過程中所需要的關鍵字比較次數總和不超過 n, 故整個排序過程所需要的關鍵字比較總次數 c(n)=o(nlgn) 。因為快速排序的記錄移動次數不大於比較的次數,所以快速排序的最壞時間複雜度應為 o(n 2 ), 最好時間複雜度為 o(nlgn) 。

基準關鍵字的選取:在當前無序區中選取劃分的基準關鍵字是決定演算法效能的關鍵。 ① 「三者取中」的規則,即在當前區間裡,將該區間首、尾和中間位置上的關鍵字比較,以三者之中值所對應的記錄作為基準,在劃分開始前將該基準記錄和該區的第 1 個記錄進行交換,此後的劃分過程與上面所給的 partition 演算法完全相同。 ② 取位於 low 和 high 之間的隨機數 k(low <=k <=high), 用 r[k] 作為基準;選取基準最好的方法是用乙個隨機函式產生乙個位於 low 和 high 之間的隨機數 k(low <=k <=high), 用 r[k] 作為基準 , 這相當於強迫 r[low..high] 中的記錄是隨機分布的。用此方法所得到的快速排序一般稱為隨機的快速排序。隨機的快速排序與一般的快速排序演算法差別很小。但隨機化後,演算法的效能大大提高了,尤其是對初始有序的檔案,一般不可能導致最壞情況的發生。演算法的隨機化不僅僅適用於快速排序,也適用於其他需要資料隨機分布的演算法。

平均時間複雜度:儘管快速排序的最壞時間為 o(n 2 ), 但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快的,快速排序亦因此而得名。它的平均時間複雜度為 o(nlgn) 。

空間複雜度:快速排序在系統內部需要乙個棧來實現遞迴。若每次劃分較為均勻,則其遞迴樹的高度為 o(lgn), 故遞迴後所需棧空間為 o(lgn) 。最壞情況下,遞迴樹的高度為 o(n), 所需的棧空間為 o(n) 。

穩定性:快速排序是非穩定的。  

如何提高效率

如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...

Python 提高效率

最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...