快速排序改進

2021-07-10 21:02:37 字數 1149 閱讀 2421

快速排序平均複雜度為o(nlgn)

最壞情況為o(n^2),即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o(nlogn),最壞情況下為o(n^2)

1.如果在排序時選取最後乙個元素為基準,則可以通過以下方法來避免劃分的不平衡。

int patition(int *pnarr, int nleft, int nright)

}swap(&pnarr[i+1],&pnarr[nright]);

if (bexchange)

else

}

即設定乙個標誌標示在劃分過程中有沒有交換元素,如果沒有交換元素就返回陣列中間的元素,這樣就可以避免最壞情況。

2.但是上面的改進只適合選取最後乙個元素,如果對於乙個有序序列,選取中間元素為基準,則把中間的元素交換到最後還是會又一次交換的過程,不能改善。(改善方法可以同下面的隨機選取元素方法一樣設定閾值).

3.快速排序的最壞情況基於每次劃分對基準元素的選擇。基本的快速排序選取第乙個元素作為基準元素。這樣在陣列已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取乙個元素作為基準元素。這種情況下雖然最壞情況仍然是o(n^2),但最壞情況不再依賴於輸入資料,而是由於隨機函式取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。所以隨機化快速排序可以對於絕大多數輸入資料達到o(nlogn)的期望時間複雜度。

4.設定閾值。快速排序的實現需要消耗遞迴棧的空間,而大多數情況下都會通過使用系統遞迴棧來完成遞迴求解。在元素數量較大時,對系統棧的頻繁訪問會影響到排序的效率。

一種常見的辦法是設定乙個閾值,在每次遞迴求解中,如果元素總數不足這個閾值,則放棄快速排序,呼叫乙個簡單的排序過程完成該子串行的排序。這樣的方法減少了對系統遞迴棧的頻繁訪問,節省了時間的消費。

一般的經驗表明,閾值取乙個較小的值,排序演算法採用選擇、插入等緊湊、簡潔的排序。乙個可以參考的具體方案:閾值t=10,排序演算法用選擇排序。

閾值不要太大,否則省下的訪問系統棧的時間,將會被簡單排序演算法較多的時間花費所抵消。

快速排序改進

public class quicksort exec a,lo,j return j 用分治法來進行快速排序 public static void sort comparable a,int lo,int hi public static void show comparable a system...

快速排序的改進

改寫partition演算法。要求 一次partition之後,小於基準元素key的數在左邊,等於key的在中間,大於key的在右邊 思路一 參照演算法導論上的思想,做出改進 i指向小於基準元素的序列的末尾,j指向等於基準元素的序列的末尾,k指向當前遍歷到的元素。include include us...

快速排序的改進

快速排序最壞情況下,要比較o n 2 次,但平均效能為nlogn,基本達到了比較類排序所需時間的的下界。核心 為 void qsort int data,int begin,int end int pivot,i,j if begin end return i begin j end pivot d...