算法导论学习笔记之快速排序

一、快速排序思想

与归并排序类似,快速排序同样使用了分治思想:

分解:数组A[ p..r ]被划分成2个可能为空的子数组A[p..q-1]和A[q+1..r]使得A[p..q-1]中的所有的元素都小于等于A[q]而且A[q+1..r]中的所有元素都大于等于A[q]

计算下标 q 也是过程的一部分

解决:递归的调用快速排序对子数组进行排序

合并:快速排序是原址的,不需要合并操作

二、快速排序算法

快速排序(A,p,r)
	if(p<r)
		q = 划分(A,p,r)
		快速排序(A,p,q - 1)
		快速排序(A,q + 1,r)
快速排序的核心在于 划分 例程:

划分总是选择一个主元,这里选择数组最后一个元素A[ r ],划分的目标是找到主元最终应该在序列中的什么位置才能使主元左边的元素都小于或等于主元,而主元右边的元素都大于或等于主元。在这个位置还没有确定出来之前,它总是有一个假定的位置,称为虚轴

划分(A,p,r)
	x = A[ r ]	        //选定主元
	i = p - 1               //虚轴 = i + 1,开始的时候,还没有找到一个比主元小的元素,虚轴为最小序列号 p
	for j = p .. r-1 step = 1
		if A[ j ] <= x	//找到一个比主元小的元素,虚轴(i + 1)应该右移一个元素(+ 1),在虚轴左边腾好一个位置A[i + 1],好把A[j] 放进去
			i = i + 1	    //i 代表虚轴左边的首个位置,所以 i + 1 等价于虚轴 + 1
			交换A[ i ] 与 A[ j ] //A[ j ]之前肯定没有找到小于或等于主元x的元素,而且 i <= j,故A[ i ]定大于x,放心交换
	交换A[i + 1] 与 A[ r ]  //循环结束时,最后一个小于或等于主元x的元素A[i]已经完成交换,虚轴 = i + 1就应该是主元x=A[r]的位置
	return i + 1
快速排序在最坏情况下的复杂度为O(n^2),但它的期望时间复杂度为O(nlgn),它实际上被认为是实际排序应用中最好的选择。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值