標籤:size fill term class 地區 準備 獨立 pytho 分析
快速排序簡介
快速排序,又稱劃分交換排序,從無序隊列中挑取一個元素,把無序隊列分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
簡單來說:挑元素、劃分組、分組重複前兩步
快速排序原理
通過上面對快速排序的簡介,我們知道了,快速排序主要包括以下兩方面:
挑元素劃分組、整體遞迴分組
挑元素劃分組:
特點:
1、因為是無序隊列,所以位置可以隨機挑
2、臨時劃分一個空間,存放我們挑選出來的中間元素
3、左標籤位置空,移動右標籤,反之一樣
4、重複3,直到左右側標籤指向同一個位置,
5、把臨時存放的中間元素,歸位
一句話:左手右手一個慢動作,右手左手慢動作重播
整體劃分:
特點:
1、遞迴拆分
2、拆分到最後,所有小組內的元素個數都是1
一句話:遞迴拆分到不能再拆
代碼實踐分析
根據上面兩個的分析,我們要從兩個大方面分析:
序列切割 和 遞迴拆分
1、序列切割
序列切割這個知識點,我們從四個方面分別介紹:
3個基本標籤、右側推進、左側推進、停止推進(即元素歸位)
1.1、3個基本標籤
大小地區切割,至少涉及到三個標籤:
mid:指定要切割的臨時中間數字
left:從隊列左側推進的標籤
right:從隊列右側推進的標籤
1 def quick_sort(li, start, end): 2 # 分治 一分為二 3 # start=end ,證明要處理的資料只有一個 4 # start>end ,證明右邊沒有資料 5 if start >= end: 6 return 7 # 定義兩個遊標,分別指向0和末尾位置 8 left = start 9 right = end10 # 把0位置的資料,認為是中間值11 mid = li[left]12 while left < right:13 # 讓右邊遊標往左移動,目的是找到小於mid的值,放到left遊標位置14 while left < right and li[right] >= mid:15 right -= 116 li[left] = li[right]17 # 讓左邊遊標往右移動,目的是找到大於mid的值,放到right遊標位置18 while left < right and li[left] < mid:19 left += 120 li[right] = li[left]21 # while結束後,把mid放到中間位置,left=right22 li[left] = mid23 # 遞迴處理左邊的資料24 quick_sort(li, start, left-1)25 # 遞迴處理右邊的資料26 quick_sort(li, left+1, end)27 28 if __name__ == ‘__main__‘:29 l = [6,5,4,3,2,1]30 # l = 3 [2,1,5,6,5,4]31 # [2, 1, 5, 6, 5, 4]32 quick_sort(l,0,len(l)-1)33 print(l)34 # 穩定性:不穩定35 # 最優時間複雜度:O(nlogn)36 # 最壞時間複雜度:O(n^2)
關鍵點:
序列切割:
1、挑中間元素:mid = alist[start]
2、右推進:while right > left and alist[right] >= mid:
3、左推進:while left < right and alist[left] < mid:
4、推進迴圈:while left < right:
5、元素歸位:alist[left] = mid
遞迴拆分:
1、小組邊界確定:left = start、right = end
2、遞迴允出準則:if start < end:
3、函數自調用:quick_sort(alist, start, end)
時間複雜度
最優時間複雜度:O(nlogn)
對於每次快排,left和right的標籤分別在左右兩冊資料全部都移動了一遍,相當於遍曆了所有資料,那麼時間複雜度是O(n)
因為涉及到了遞迴分組,所以他的時間複雜度是O(logn)
整體來說:最優的時間複雜度是 O(nlogn)
最壞時間複雜度:O(n2)
因為遞迴分組分組的條件不一定是二分,有可能每一次mid指定的都是最大或者最小,那麼有多少個元素,我們就可能分多少次組,這種情況時間複雜度就是O(n)了
所以最壞的時間複雜度就是O(n2),那麼最壞也不過如此了。
穩定性:不穩定
思考:
改哪個地方,結果是降序?
while right > left and alist[right] >= mid: 代碼中的 >= 改為 <=
while left < right and alist[left] < mid 代碼中的 < 改為 >
本節內容小結:
1、快速排序原理:挑元素、劃分組,分組重複前兩步。
2、快速排序實踐步驟:
劃分組:準備工作+左右移動+元素歸位
遞迴:函數自調用+允出準則
Python 實現快排