演算法 9 快速排序

2021-10-02 07:14:16 字數 2049 閱讀 5826

1、描述

2、特點

3、**實現

3.1、切分函式partition()圖示

4、效能

5、快速排序優化(小陣列插入排序)

6、快排優化(三向切分)

快速排序也是基於遞迴實現的。和歸併排序不同的是:歸併排序將陣列不斷的二等分,而快速排序是根據子陣列的第乙個元素的大小將陣列分成兩部分的。

第一步:根據陣列的第乙個元素a[0]=key的大小,將比key小的子陣列a中,將比key大的放在子陣列b中。

第二步:將子陣列a 、子陣列b和key合併成乙個陣列,key放在了中間位置。

第三步:繼續將子陣列a繼續進行第一二步,b也一樣。

..................不斷遞迴,這個陣列就變得有序了。

優勢:快速排序切分方法的內迴圈會用乙個遞增的索引將陣列元素和乙個定值比較。這種簡潔性 也是快速排序的乙個優點,很難想象排序演算法中還能有比這更短小的內迴圈了。例如,歸併 排序和希爾排序一般都比快速排序慢,其原因就是它們還在內迴圈中移動資料。

風險:在切分不平衡時這個程式可能會 極為低效。例如,如果第一次從最小的元素切分,第二次從第二小的元素切分,如此這般,每次呼叫 只會移除乙個元素。這會導致乙個大子陣列需要切分很多次。我們要在快速排序前將陣列隨機排序的 主要原因就是要避免這種情況。它能夠使產生糟糕的切分的可能性降到極低,我們就無需為此擔心了。

總結:總的來說,可以肯定的是對於大小為 n 的陣列,快速排序 的執行時間在 1.39nlgn 的某個常 數因子的範圍之內。歸併排序也能做到這一點,但是快速排序一般會更快(儘管它的比較次數多 39%),因為它移動資料的次數更少。

當我們將大的陣列遞迴拆分成小的陣列的,陣列長度低於7的時候,我們使用插入排序,而不是讓它繼續遞迴下去,這樣可以加快排序的速度。

三向切分是為了解決陣列中存在大量重複資料進行的一種優化,原版快速排序是將陣列分成 大於key,和小於key兩部分,現在將陣列分成大於,小於,和等於三部分。

對於存在大量重複元素的陣列,這種方式的排序要比標準的快速排序效率高很多。

public static void sort(double a) 

public static void sort(double a, int lo, int hi)

sort(a, lo, left - 1);// 繼續遞迴的部分

sort(a, right + 1, hi);// 繼續遞迴的部分

}private static void exch(double a, int i, int j)

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...