演算法之旅 快速排序法

2021-08-08 21:34:48 字數 2191 閱讀 8590

html5學堂-碼匠:前幾期「演算法之旅」跟大家分享了氣泡排序法和選擇排序法,它們都屬於時間複雜度為o(n^2)的「慢」排序。今天跟大家分享多種排序演算法裡使用較廣泛,速度快的排序演算法 —— 快速排序法 [ 平均時間複雜度為o (n logn) ]。

tips 2:如果無特殊說明,本文的快速排序是從小到大的排序。

快速排序是一種劃分交換排序,它採用分治的策略,通常稱其為分治法。

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

從序列中任選乙個數作為「基準」;

所有小於「基準」的數,都挪到「基準」的左邊;所有大於等於「基準」的數,都挪到「基準」的右邊;

在這次移動結束之後,該「基準」就處於兩個序列的中間位置,不再參與後續的排序;

針對「基準」左邊和右邊的兩個子串行,不斷重複上述步驟,直到所有子串行只剩下乙個數為止。

現有乙個序列為 [8, 4, 7, 2, 0, 3, 1],如下演示快速排序法如何對其進行排序。

先獲取基準的索引值,再使用splice陣列方法取出基準值。

tips:該例項中, 基準的索引值 = parseint(序列長度 / 2)

tips:splice方法會改變原始陣列。例如,arr = [1, 2, 3]; 基準索引值為1,基準值為2,原始陣列變為arr = [1, 3];

與「基準」比較大小,並拆分為兩個子串行

小於「基準」的數儲存於leftarr陣列當中,大於等於「基準」的數儲存於rightarr陣列當中

tips:當然,也可以將 小於等於「基準」的數存於leftarr,大於「基準」的數存於rightarr

由於要遍歷序列,將每乙個數與「基準」進行大小比較,所以,需要借助for語句來實現

定義乙個函式,形參用於接收陣列

function quicksort(arr) ;

實現遞迴呼叫遍歷子串行,用concat陣列方法組合子串行的結果

遞迴呼叫的過程中,子串行的長度等於1時,則停止遞迴呼叫,返回當前陣列。

最壞情況:每一次選取的「基準」都是序列中最小的數/最大的數,這種情況與氣泡排序法類似(每一次只能確定乙個數[基準數]的順序),時間複雜度為o(n^2)

最好情況:每一次選取的「基準」都是序列中最中間的乙個數(是中位數,而不是位置上的中間),那麼每次都把當前序列劃分成了長度相等的兩個子串行。這時候,第一次就有n/2、n/2兩個子串行,第二次就有n/4、n/4、n/4、n/4四個子串行,依此類推,n個數一共需要logn次才能排序完成(2^x=n,x=logn),然後每次都是n的複雜度,時間複雜度為o(n logn)

最壞情況:需要進行n‐1 次遞迴呼叫,其空間複雜度為 o(n)

最好情況:需要logn次遞迴呼叫,其空間複雜度為o(logn)

快速排序是一種不穩定排序演算法

例如:現有序列為[1, 0, 1, 3],「基準」數字選擇為第二個1

在第一輪比較之後,變成了[0, 1, 1, 3],左序列為[0],右序列為[1, 3](右序列的1是此前的第乙個1)

不難發現,原序列的兩個1的先後順序被破壞了,改變了先後順序,自然就是「不穩定」的排序演算法了

在此前的「氣泡排序法」一文當中,我們詳細講解過o是什麼,在此就不多說了,直接上圖吧

選擇排序法

氣泡排序法

演算法之旅 選擇排序法

html5學堂 碼匠 資料快速的計算與排序,與前端頁面效能有直接的關係。由於排序的演算法有很多,在本次 演算法系列 的分享當中,我們先從簡單易上手的選擇排序法開始,其它的排序演算法會隨後陸續跟大家一起分享。為解決乙個問題而採取的方法和步驟,稱為演算法。我們可以把演算法看成一本 福字剪紙教程 其中每一...

演算法之旅 氣泡排序法

html5學堂 碼匠 本期繼續走入演算法 氣泡排序法。氣泡排序演算法相對簡單,容易上手,穩定性也比較高,算是一種較好理解的演算法,也是面試官高頻提問的演算法之一。從序列頭部開始遍歷,兩兩比較,如果前者比後者大,則交換位置,直到最後將最大的數 本次排序最大的數 交換到無序序列的尾部,從而成為有序序列的...

演算法之旅 選擇排序法

html5學堂 碼匠 資料快速的計算與排序,與前端頁面效能有直接的關係。由於排序的演算法有很多,在本次 演算法系列 的分享當中,我們先從簡單易上手的選擇排序法開始,其它的排序演算法會隨後陸續跟大家一起分享。為解決乙個問題而採取的方法和步驟,稱為演算法。我們可以把演算法看成一本 福字剪紙教程 其中每一...