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

本文详细介绍了快速排序的实现、最好情况、平均复杂度及最坏情况下的优化方法。通过选取主元的策略和设置递归规模阈值,可以有效避免最坏情况,将快速排序的效率提升至平均的O(n log n)。此外,还探讨了利用快速排序求第k大元素的方法以及在单链表上的应用。
摘要由CSDN通过智能技术生成

快速排序

实现

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. 上述的递归实现,如果待排序列的规模比较小,递归的副作用会凸显出来,效果还不如简单的插入排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值