基礎演算法之快速排序演算法

2022-04-28 22:00:27 字數 1654 閱讀 3317

快速排序基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

比如序列[6,8,1,4,3,9],選取6為基準數key(不會變的),然後從右往左遍歷過去,發現第乙個比key小的數3,就把6和3交換位置,序列就變成了[3,8,1,4,6,9]

然後從左往右遍歷過去,發現第乙個比key大的值8,把8和6交換位置,序列變成[3,6,1,4,8,9]

以上稱為一次小迴圈

然後再來一次迴圈,序列變成了[3,4,1,6,8,9],發現6的左邊都是比6小的數,右邊都是比6大的數,此時無法再遍歷了,於是退出這個大迴圈

接下去,需要對key值左邊的序列和右邊的序列分別重複以上操作,也就是[3,4,1]和[8,9],只要用遞迴就行了。

**如下:

1

defquick_sort(array,left,right):

2if left >=right:

3return

45 low = left#

序列第乙個索引

6 high= right#

序列最後乙個索引

7 key = array[low]#

基準書數89

while low < high:#

在左右未相遇的情況下

10while low < high and array[high] > key:#

找到右側比key小的那個值

11 high -= 1

12 array[low] =array[high]

13 array[high] =key

1415

while low < high and array[low] <= key:#

找到左側比key大的值

16 low += 1

17 array[high] =array[low]

18 array[low] =key

1920 quick_sort(array,left,low-1)#

對key左邊的序列進行遞迴

21 quick_sort(array,low+1,right)#

對key右邊的序列進行遞迴

22 array = [8,4,2,3,5,34,1,40] quick_sort(array,0,len(array)-1) print(array) #

[1, 2, 3, 4, 5, 8, 34, 40]

需要注意的地方是,10和15行需要加上等於號,可以兩個或者任意乙個,不然遇上序列中有多個相同的值會進入死迴圈

直接插入排序複雜度: 

時間複雜度: 最好情況o(nlogn), 最壞情況o(n^2), 平均情況o(nlogn)

下面空間複雜度是看別人部落格的,我也不大懂了……改天再研究下。

最優的情況下空間複雜度為:o(logn);每一次都平分陣列的情況

最差的情況下空間複雜度為:o( n );退化為氣泡排序的情況

穩定性:不穩定

演算法基礎之排序 快速排序

上一節簡單介紹了一下常用的插入排序,這一節,我們來看看實際中針對大量資料最常用的快速排序演算法。快速排序演算法採用的是一種分治的策略,其的特點就是。快!演算法的平均時間複雜度為o nlog n 快速排序演算法處理公升序排序的思路大致如下 1 選中待排序陣列中最左端的數為參考數 2 從陣列的右端開始向...

基礎排序演算法之快速排序

基礎思想 分治 選首元素作為key值,迴圈比較,比其小的元素放左側,比其大的放右側 分成的兩個數列,遞迴重複上述步驟 include includeusing namespace std 快速排序 時間複雜度 o n log n 從數列取乙個數作為key值 一般取第乙個數 i 從右邊遍歷找到第乙個比...

基礎演算法 快速排序演算法

時間複雜度 最壞的情況和氣泡排序一樣,為o n 2 平均的時間複雜度 nlog n 基本思想 1 取最左邊的數作為標準 2 從右邊開始查詢,找到從右邊數第乙個小於標準temp的數 3 從左邊繼續查詢,找到第乙個大於標準temp的數 4 將左右兩邊找到的數進行交換,如此往復,直到左邊和右邊碰到一起,即...