随机化算法:快速排序与选择算法及选择算法最坏情况的剔除

快速排序

一丶普通快速排序的性能

在这里插入图片描述在这里插入图片描述

最坏情况

在这里插入图片描述
得 T(n)=Θ(n2)

最好情况

在这里插入图片描述
得 T(n)=Θ(nlogn)
且以常数比列划分得都是Θ(nlogn)

二丶随机化快速排序的性能

为什么引入随机化

像快速排序的运行时间是根据输入序列顺序来决定的,假如我们输入的序列是正序或者逆序排好的,那么它为Θ(n2),但是我们选择了随机化算法,将运行时间独立于输入序列顺序,受随机生成器的影响,因为即便你排好了,选择的主元是变化的,所以引入随机化算法,但仍然有可能为Θ(n2)
在这里插入图片描述在这里插入图片描述
随机化版本我们需要算的是期望运行时间 Θ(nlogn)
最坏和最好运行时间与 不随机的一样,下面是随机化期望运行时间证明
在这里插入图片描述
下界证明同理


选择算法:顺序统计量

一丶直接看随机化版本

在这里插入图片描述

我们考虑极端情况,每次应该找的值都在数多的一边,

最好情况

先假设划分为1/10 与 9/10
T(n)≤T(9n/10)+Θ(n)
得 T(n)=Θ(n)
常数比例的划分都为Θ(n)

最坏情况

T(n)≤T(n-1)+Θ(n) (等差求和)
得 T(n)=Θ(n2)

期望运行时间

Θ(n),下面是证明
在这里插入图片描述
下界证明同理

二丶剔除最坏情况

  1. 将n个元素划分为⌊n/5⌋组,每组5个元素,且至多一组少于五个元素
  2. 寻找⌈n/5⌉组中的中位数,要保证上面的比中位数大,下面的比中位数小,如图 Θ(n) 因为每组是有限个元素可以在线性时间内完成
  3. 然后对递归对这个⌈n/5⌉组中的中位数找出中位数x,要保证前面的比中位数大,后面的比中位数小,如图T(n/5)
  4. 然后利用中位数x作为基准划分,返回位置pos,即x为第pos大的数
  5. 然后如果pos=i,找到了,小于说明需要继续用select递归在小区找,大于递归在大区找

算法过程类似于下
在这里插入图片描述

int select(A,l,h,i)
{
	//这是最后不可划分的了数量不足5,然后排序,返回这里的中位数
	if(h-l+1<=5) 
	{ sort() return A[3]  }
	//每一组排序后自然可以找出中位数,在3号位置,因为5个一组)
	//然后为了找出中位数的中位数,把第i组中位数与i号位置交换,好递归继续找中位数
	groupnum=(h-l+1)/5
	
	for group : 1 > groupnum 
	{sort(group);swap(group,group[3])} //只有一组当然不会执行
	//递归找出中位数的中位数
	pivot=select(A,l,groupnum,i)
	
	//中位数作为基准的位置
	pos=partition(A,l,h,pivot) 
	
	if(pos==i) return A[pos]
	else if(pos>i) select(A,pos+1,h,i)
	else select(A,l,pos-1,i)
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilyil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值