快速排序基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
比如序列[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],只要用遞迴就行了。
**如下:
1defquick_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 將左右兩邊找到的數進行交換,如此往復,直到左邊和右邊碰到一起,即...