快速排序簡介
快速排序,又稱劃分交換排序,從無序隊列中挑取一個元素,把無序隊列分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
簡單來講:挑元素、劃分組、分組重複前兩步函數
快速排序原理示意圖
經過上面對快速排序的簡介,咱們知道了,快速排序主要包括如下兩方面:
挑元素劃分組、總體遞歸分組
挑元素劃分組示意圖:ui
特色:
一、由於是無序隊列,因此位置能夠隨機挑
二、臨時劃分一個空間,存放咱們挑選出來的中間元素
三、左標籤位置空,移動右標籤,反之同樣
四、重複3,直到左右側標籤指向同一個位置,
五、把臨時存放的中間元素,歸位
一句話:左手右手一個慢動做,右手左手慢動做重播spa
總體劃分示意圖:3d
特色:
一、遞歸拆分
二、拆分到最後,全部小組內的元素個數都是1
一句話:遞歸拆分到不能再拆code
代碼實踐分析
根據上面兩個示意圖的分析,咱們要從兩個大方面分析:
序列切割 和 遞歸拆分blog
一、序列切割
序列切割這個知識點,咱們從四個方面分別介紹:
3個基本標籤、右側推動、左側推動、中止推動(即元素歸位)排序
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 = end 10 # 把0位置的數據,認爲是中間值 11 mid = li[left] 12 while left < right: 13 # 讓右邊遊標往左移動,目的是找到小於mid的值,放到left遊標位置 14 while left < right and li[right] >= mid: 15 right -= 1 16 li[left] = li[right] 17 # 讓左邊遊標往右移動,目的是找到大於mid的值,放到right遊標位置 18 while left < right and li[left] < mid: 19 left += 1 20 li[right] = li[left] 21 # while結束後,把mid放到中間位置,left=right 22 li[left] = mid 23 # 遞歸處理左邊的數據 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)
關鍵點:
序列切割:
一、挑中間元素:mid = alist[start]
二、右推動:while right > left and alist[right] >= mid:
三、左推動:while left < right and alist[left] < mid:
四、推動循環:while left < right:
五、元素歸位:alist[left] = mid
遞歸拆分:
一、小組邊界肯定:left = start、right = end
二、遞歸退出條件:if start < end:
三、函數自調用:quick_sort(alist, start, end)隊列
時間複雜度
最優時間複雜度:O(nlogn)
對於每次快排,left和right的標籤分別在左右兩冊數據所有都移動了一遍,至關於遍歷了全部數據,那麼時間複雜度是O(n)
由於涉及到了遞歸分組,因此他的時間複雜度是O(logn)
總體來講:最優的時間複雜度是 O(nlogn)class
最壞時間複雜度:O(n2)
由於遞歸分組分組的條件不必定是二分,有可能每一次mid指定的都是最大或者最小,那麼有多少個元素,咱們就可能分多少次組,這種狀況時間複雜度就是O(n)了
因此最壞的時間複雜度就是O(n2),那麼最壞也不過如此了。
穩定性:不穩定
思考:改哪一個地方,結果是降序?while right > left and alist[right] >= mid: 代碼中的 >= 改成 <=while left < right and alist[left] < mid 代碼中的 < 改成 >本節內容小結:一、快速排序原理:挑元素、劃分組,分組重複前兩步。二、快速排序實踐步驟:劃分組:準備工做+左右移動+元素歸位遞歸:函數自調用+退出條件