排序算法之快速排序(关键词:数据结构/算法/排序算法/快速排序)

版权声明:本文为博主原创文章,可以转载,但转载前请联系博主。 https://blog.csdn.net/qq_33528613/article/details/84865374

快速排序

实现

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

猜你喜欢

转载自blog.csdn.net/qq_33528613/article/details/84865374