有趣的事,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、原理
-
在數列之中,選擇一個元素作為”基准”(pivot),或者叫比較值。
-
數列中所有元素都和這個基准值進行比較,如果比基准值小就移到基准值的左邊,如果比基准值大就移到基准值的右邊
-
以基准值左右兩邊的子列作為新數列,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。
舉個例子,假設我現在有一個數列需要使用快排來排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我們來看看使用快排的詳細步驟:
-
選取中間的
66
作為基准值(基准值可以隨便選) -
數列從第一個元素11開始和基准值
66
進行比較,小於基准值,那么將它放入左邊的分區中,第二個元素99比基准值66
大,把它放入右邊的分區中。 -
然后依次對左右兩個分區進行再分區,直到最后只有一個元素
-
分解完成再一層一層返回,返回規則是:左邊分區+基准值+右邊分區
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、特點
-
穩定性:快排是一種不穩定排序,比如基准值的前后都存在與基准值相同的元素,那么相同值就會被放在一邊,這樣就打亂了之前的相對順序
-
比較性:因為排序時元素之間需要比較,所以是比較排序
-
時間復雜度:快排的時間復雜度為O(nlogn)
-
空間復雜度:排序時需要另外申請空間,並且隨着數列規模增大而增大,其復雜度為:O(nlogn)
-
歸並排序與快排 :歸並排序與快排兩種排序思想都是分而治之,但是它們分解和合並的策略不一樣:歸並是從中間直接將數列分成兩個,而快排是比較后將小的放左邊大的放右邊,所以在合並的時候歸並排序還是需要將兩個數列重新再次排序,而快排則是直接合並不再需要排序,所以快排比歸並排序更高效一些,可以從示意圖中比較二者之間的區別。
- 快速排序有一個缺點就是對於小規模的數據集性能不是很好。
結果
Successfully !!!
有趣的事,Python永遠不會缺席!還不來加我,瞅什么瞅。