排序演算法從入門到精通之六 快速排序

2021-08-18 18:19:51 字數 1294 閱讀 8202



快速排序的演算法是一種分而治之的演算法,是乙個遞迴演算法。在通常情況下,快速排序演算法是已知的最快的演算法,故稱這個演算法為快速排序。通常情況指資料的分布比較平均,關鍵的的範圍比較大。當關鍵字為公升序或者逆序,歸併排序比快速排序快的多。當關鍵字的範圍非常窄,計數排序的時間複雜度可低至o(n).

其方法是:

1.首先找出乙個樞軸元素base。

2.掃瞄待排序的陣列,將這個陣列劃分為2部分,使左部分的所有元素小於等於base,右部分的所有元素大於base。

3.對左部分的子陣列繼續做這個操作。

4.對右部分的子陣列做同樣的操作。

5.繼續遞迴下去,直到陣列的長度小於為1.

下面的**是這個演算法的乙個實現。其核心為partition_sort函式,這個函式的對陣列的乙個子區間 [low,high]做乙個掃瞄。

這個演算法取arr[low]作為樞軸元素,採用雙向掃瞄方法。

如果元素大於等於樞軸元素則向左掃瞄,right--, 如果元素小於樞軸元素,則向右掃瞄,left++。

掃瞄結束後將原始區間[low,right] 分為3個子區間,[low,left-1], 中間區間[left,left],只包括乙個元素,右區間[left+1,high],然後遞迴呼叫partition_sort對左右區間做同樣的處理。

下面的**中,當區間長度小於等於insert_sort_threshold,呼叫插入排序演算法。

#include #include #include "sorts.h"

void partition_sort(ele_type arr, int low, int high)

left=low;right=high;

base= arr[low];

while (right>left)

// fill the hole, the hole is arr[left]

while (left上面的實現是乙個最簡單的版本。但是這個版本有個缺點。對於特定的資料分布,如陣列是嚴格的非遞減序列或者非遞增序列,這個演算法的遞迴深度會增加到n,n為陣列長度。時間複雜度增加到o(n^2),空間複雜度增加到o(n)。效能變差還是小事兒,要命的是,由於棧的空間比較小,當陣列較大時,會導致棧溢位,程式崩潰。

為了解決問題,人們想出各種方法。一種方法是,在序列中隨機選擇乙個元素作為樞軸元素。另一種方法是,選擇陣列最左,中間,最右的三個元素的中間值作為樞軸,簡稱三者取中法。

對陣列的掃瞄方法也不限於雙向掃瞄。演算法導論(第二版)第7章 給出的方法是

採用自左向右的方向掃瞄陣列, 將待排序的陣列分為3部分,左邊的部分<=x, x為樞軸元素,中間的部分》x,右邊的部分為未排序部分。

回溯演算法,從入門到精通

回溯演算法在資料結構中式一種常用的演算法,也是一種暴力求解法,基本思想是深度遍歷,選擇一條路一步一步走,當走不通的時候或者已經求的正確的結果,返回上一步,接著選擇另一條路走,直到遍歷完所有節點。回溯演算法是一種思想,真正用 實現的時候,大多時候都需要用的方法是遞迴。一.回溯演算法最出名的是8皇后問題...

排序演算法從入門到精通之二 氣泡排序

氣泡排序是最樸素的排序演算法。其過程就像燒水過程一樣,大的水泡從壺底一步一步冒出來,直到水面以上。其基本思想是 1.掃瞄整個陣列,若陣列長度為n,第一趟掃瞄過程中,下標j從0到n 2,依次比較arr j 與 arr j 1 若前者大於後者交換這兩個元素。2.第一趟掃瞄完成後,最大的那個元素已經放到陣...

PyTorch實戰福利從入門到精通之六 線性回歸

一元線性模型非常簡單,假設我們有變數 x ix i xi 和目標 y iy i yi 每個 i 對應於乙個資料點,希望建立乙個模型 y i wxi b hat i w x i b y i wxi by i hat i y i 是我們 的結果,希望通過 y i hat i y i 來擬合目標 y iy...