快速排序quicksort笔记

快排采用了分治法的思想和递归的方式进行排序,每次递归都会确定一个位置的数值(此处是位置i),且大于等于左侧所有值,小于等于右侧所有值。

def _quicksort(l, left, right):
	# left 到 right 里的都是未经过排序的
	if left >= right:
		return
	i, j = left, right
	# 如果list原本是降序排序,则算法时间会退化为O(n^2)
	# 互换最左元素和中间元素可预防这种情况
	mid = left + (right - left / 2)
	l[left], l[mid] = l[mid], l[left]
	key = l[left]
	while i < j:
		# 先从后往前扫,直到小于key
		while i < j and key >= l[j]:
			j -= 1
		a[i] = a[j]  # 此时a[i]已经backup到了key,可以放心覆盖
		# 再从前往后扫,直到大于key
		while i < j and key <= l[j]:
			i += 1
		a[j] = a[i]  # 此时a[j]已经放到原本的a[i],可以放心覆盖
		# 不断重复j往前,i往后,直到 i == j
	# 此时i == j
	a[i] = key
	_quicksort(l, left, i - 1)
	_quicksort(l, i + 1, right)


def quicksort(l):
	_quicksort(l, 0, len(l) - 1)


if __name__ == "__main__":
	l = [66, 42, 52, 78, 99, 11]
	quicksort(l)
	print(l)
	# [11, 42, 52, 66, 78, 99]

参考文献
百度百科:快速排序算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值