Python排序算法(一)——快速排序


有趣的事,Python永遠不會缺席!

如需轉發,請注明出處:小婷兒的python  https://www.cnblogs.com/xxtalhr/p/10768593.html 

 

  排序算法(Sorting algorithm)是計算機科學最古老、最基本的課題之一。要想成為合格的程序員,就必須理解和掌握各種排序算法。其中”快速排序”(Quicksort)使用得最廣泛,速度也較快。它是圖靈獎得主C. A. R. Hoare(托尼·霍爾)於1960時提出來的。

一、快速排序(Quicksort)

  快速排序(quick sort)的采用了分治的策略。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列

1、原理

  1. 在數列之中,選擇一個元素作為”基准”(pivot),或者叫比較值。

  2. 數列中所有元素都和這個基准值進行比較,如果比基准值小就移到基准值的左邊,如果比基准值大就移到基准值的右邊

  3. 以基准值左右兩邊的子列作為新數列,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。

 

舉個例子,假設我現在有一個數列需要使用快排來排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我們來看看使用快排的詳細步驟:

  1. 選取中間的66作為基准值(基准值可以隨便選)

  2. 數列從第一個元素11開始和基准值66進行比較,小於基准值,那么將它放入左邊的分區中,第二個元素99比基准值66大,把它放入右邊的分區中。

  3. 然后依次對左右兩個分區進行再分區,直到最后只有一個元素

  4. 分解完成再一層一層返回,返回規則是:左邊分區+基准值+右邊分區

 2、代碼

代碼用jupyternotebook實現

 1 def quick_sort(b):
 2     """快速排序"""
 3     if len(b) < 2:
 4         return arr
 5     # 選取基准,隨便選哪個都可以,選中間的便於理解
 6     mid = arr[len(b) // 2]
 7     # 定義基准值左右兩個數列
 8     left, right = [], []
 9     # 從原始數組中移除基准值
10     b.remove(mid)
11     for item in b:
12         # 大於基准值放右邊
13         if item >= mid:
14             right.append(item)
15         else:
16             # 小於基准值放左邊
17             left.append(item)
18     # 使用迭代進行比較
19     return quick_sort(left) + [mid] + quick_sort(right)

b = [11, 99, 33, 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]
quick_sort(b)

#返回:[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

  高逼格(一行代碼表示):

1 quick_sort = lambda array: array if len(array) <= 1 else quick_sort([
2     item for item in array[1:] if item <= array[0]
3 ]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
4 
5 quick_sort([2,5,9,3,7,1,5])
6 #返回[1, 2, 3, 5, 5, 7, 9]

 

3、特點

  1. 穩定性:快排是一種不穩定排序,比如基准值的前后都存在與基准值相同的元素,那么相同值就會被放在一邊,這樣就打亂了之前的相對順序

  2. 比較性:因為排序時元素之間需要比較,所以是比較排序

  3. 時間復雜度:快排的時間復雜度為O(nlogn)

  4. 空間復雜度:排序時需要另外申請空間,並且隨着數列規模增大而增大,其復雜度為:O(nlogn)

  5. 歸並排序與快排 :歸並排序與快排兩種排序思想都是分而治之,但是它們分解和合並的策略不一樣:歸並是從中間直接將數列分成兩個,而快排是比較后將小的放左邊大的放右邊,所以在合並的時候歸並排序還是需要將兩個數列重新再次排序,而快排則是直接合並不再需要排序,所以快排比歸並排序更高效一些,可以從示意圖中比較二者之間的區別。

  6. 快速排序有一個缺點就是對於小規模的數據集性能不是很好

結果   

  Successfully !!!

  有趣的事,Python永遠不會缺席!還不來加我,瞅什么瞅。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM