排序演算法之快速排序(關鍵詞:資料結構/演算法/排序演算法/快速排序)
阿新 • • 發佈:2018-12-09
快速排序
實現
def partition(nums, left, right): middle = (left+right) // 2 pivot = nums[middle] swap(nums, middle, right) # 現在主元 pivot 等於 nums[right] boundary = left for index in range(left, right): if nums[index] < pivot: swap(nums, index, boundary) boundary += 1 swap(nums, boundary, right) return boundary def qsort(nums, left, right): if left < right: pivotIndex = partition(nums, left, right) qsort(nums, left, pivotIndex-1) qsort(nums, pivotIndex+1, right) def quick_sort(nums): qsort(nums, 0, len(nums)-1)
快速排序平均複雜度?最壞情況如何優化?
平均時間複雜度:O(n log n)(證明略複雜,暫不深究。)
最壞情況:
- 例如每次劃分時,都分為 1 個和 n-1 個,快速排序的時間複雜度就是 O(n^2);
- 上述的遞迴實現,如果待排序列的規模比較小,遞迴的副作用會凸顯出來,效果還不如簡單的插入排序。
優化:
- 選主元採用隨機方法或 nums[left]、nums[right]、nums[middle] 的中等大小的值。其中,採用中等大小的值作為主元,可以避免在基本有序的序列中,進行快速排序時,出現時間複雜度最壞的情況;
- 在遞迴的過程中檢查當前子問題的規模,當其小於某個閾值時,就不再繼續遞迴,而是直接呼叫插入排序。
參考文獻:
- https://github.com/henry199101/sort/blob/master/quick_sort.py;
- 《資料結構(第 2 版)》 - 浙江大學 - 7.4.2 快速排序 - P272——P276;
- 資料結構(Python) - Lambert - P53——P56;
- 11 快排。
利用快速排序求第 k 大的項
參考文獻:
- 215. Kth Largest Element in an Array - LeetCode;
- LeetCode - caikehe:Python min-heap and quick partition solutions (O(nlogn) and O(n) time complexities)
對單鏈表進行快速排序
參考文獻: