通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序。
快速排序算法的工作原理如下:
1. 從數列中挑出一個元素,稱為"基准"(pivot)。
2. 重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。
3. 在這個分區結束之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作。
4. 遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。
自我總結:快速排序的步驟就是首先將第一個數作為兩邊排序的數值,從第二個數開始對第一個數進行比較,如果大於第一個數將這個數放在第一個數的右邊,小於放左邊,依次進行比較並存放,最后將隊列分成三個部分: 左邊都比第一個數值小的數,第一個數值,右邊都比第一各值大的數。這樣就未完成了第一次排序的步驟。第二次是將前半部分的第一個值作為比較的”基數”,同第一次排序進行同樣的比較和存放,直到原隊列的第一個值之前的那個值。右邊和左邊做同樣的比較,排序,直到之后一個值。這樣依次進行遞歸,直到沒有可以在分為左右的,這樣就從小到大排序完成。
最優時間復雜度:O(nlogn)
n遍歷每個數是O(n),訪問每個數是O(logn),最終是O(nlogn)
可以轉換為求二叉樹深度的思想
最壞時間復雜度:O(n²)
穩定性:不穩定
優點:效率高,數據移動比較少,數據量越大,優勢越明顯
缺點:不穩定
下面為快速排序的代碼實現:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" # 快排 # first理解為第一個位置的索引,last是最后位置索引 def quick_sort(alist, first, last): # 遞歸終止條件 if first >= last: return # 設置第一個元素為中間值 mid_value = alist[first] # low指向 low = first # high high = last # 只要low小於high就一直走 while low < high: # high大於中間值,則進入循環 while low < high and alist[high] >= mid_value: # high往左走 high -= 1 # 出循環后,說明high小於中間值,low指向該值 alist[low] = alist[high] # high走完了,讓low走 # low小於中間值,則進入循環 while low < high and alist[low] < mid_value: # low向右走 low += 1 # 出循環后,說明low大於中間值,high指向該值 alist[high] = alist[low] # 退出整個循環后,low和high相等 # 將中間值放到中間位置 alist[low] = mid_value # 遞歸 # 先對左側快排 quick_sort(alist, first, low - 1) # 對右側快排 quick_sort(alist, low + 1, last) if __name__ == '__main__': li = [54, 26, 93, 17, 77, 31, 44, 55, 20] print(li) quick_sort(li, 0, len(li) - 1) print(li)