1. 程式人生 > >排序演算法之快速排序(關鍵詞:資料結構/演算法/排序演算法/快速排序)

排序演算法之快速排序(關鍵詞:資料結構/演算法/排序演算法/快速排序)

快速排序

實現

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. 例如每次劃分時,都分為 1 個和 n-1 個,快速排序的時間複雜度就是 O(n^2);
  2. 上述的遞迴實現,如果待排序列的規模比較小,遞迴的副作用會凸顯出來,效果還不如簡單的插入排序。

優化:

  1. 選主元採用隨機方法或 nums[left]、nums[right]、nums[middle] 的中等大小的值。其中,採用中等大小的值作為主元,可以避免在基本有序的序列中,進行快速排序時,出現時間複雜度最壞的情況;
  2. 在遞迴的過程中檢查當前子問題的規模,當其小於某個閾值時,就不再繼續遞迴,而是直接呼叫插入排序。

參考文獻:

  1. https://github.com/henry199101/sort/blob/master/quick_sort.py;
  2. 《資料結構(第 2 版)》 - 浙江大學 - 7.4.2 快速排序 - P272——P276;
  3. 資料結構(Python) - Lambert - P53——P56;
  4. 11 快排

利用快速排序求第 k 大的項

參考文獻:

  1. 215. Kth Largest Element in an Array - LeetCode
  2. LeetCode - caikehe:Python min-heap and quick partition solutions (O(nlogn) and O(n) time complexities)

對單鏈表進行快速排序

參考文獻:

  1. 148. Sort List