Python 實現快排

來源:互聯網
上載者:User

標籤: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 實現快排

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.