排序演算法之六 快速排序 Quick Sort

2021-09-08 20:23:31 字數 1397 閱讀 7511

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。在平均狀況下,排序n個元素要o(nlogn)次比較。在最壞狀況下則需要o(n^2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他o(nlogn)演算法更快,因為它的內部迴圈可以在大部分的架構上很有效率地被實現出來。

1.先從元素序列中取乙個數作為基準數。

2.將比這個基準數大的元素全放到它的右邊,小於或者等於基準數的元素放到它的左邊。這個稱為分割槽(partition)操作。最終的結果就是元素序列分成了如下左右兩個區間:

3.對左右區間遞迴的進行步驟1,2,直到各區間只有乙個元素時結束遞迴操作,這時整個元素序列就已經完成排序了。

快速排序c/c++**如下:

void

swap

(int arr,

int i,

int j)

/** * 根據基準值調整陣列為三個區域,返回基準值所在的位置

* @param arr

* @param left

* @param right

* @return 基準值所在的位置

*/int

adjustarray

(int arr,

int left,

int right)

}swap

(arr, left_index +

1, right)

;//將基準值與右區間的第乙個元素交換,該操作可能會把後面元素的穩定性打亂,所以快速排序是不穩定的演算法。

return left_index +1;

}/**

* 快速排序

* 最差時間複雜度 當每次選取的基準都是最大或最小的元素,導致每次只劃分出了乙個分割槽,需要進行n-1次劃分才能結束遞迴,時間複雜度為o(n^2)

* 最優時間複雜度 每次選取的基準都是中位數,這樣每次都均勻的劃分出兩個分割槽,只需要logn次劃分就能結束遞迴,時間複雜度為o(nlogn)

* 平均時間複雜度 o(nlogn)

* 空間複雜度 主要是遞迴造成的棧空間的使用(用來儲存left和right等區域性變數),取決於遞迴樹的深度,一般為o(logn),最差為o(n)

* 穩定性 不穩定

* @param arr

* @param left

* @param right

*/void

quicksort

(int arr,

int left,

int right)

演算法排序(六) 快速排序法

快速排序法一般來說可以分為三種,分別是 基礎快速排序法 雙路快速排序法 三路快速排序法 下面分別對以上三種快排進行梳理。排序思路 首先傳入待排序陣列,使用變數l表示陣列下標起點,使用變數r表示陣列下標終點,然後取陣列第乙個元素e做中介,使用迴圈逐步將陣列元素分為比e小和不比e小的兩部分 使用變數j記...

排序演算法 六 快速排序(交換排序)

直接排序屬於交換排序 基本思想 1 選1個基準元素 通常是第乙個元素或最後乙個元素 將待排數列分成兩部分,一部分比基準元素小,一部分比基準元素大 2 再對這兩部分數列重複步驟1 時間複雜度 最好情況 o n logn 最壞情況,退化為氣泡排序 o n n 穩定性 不穩定 python 實現 quic...

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...