快速排序是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 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...