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

快速排序

一丶普通快速排序的性能

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

最坏情况

在这里插入图片描述
得 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)
}

发布了124 篇原创文章 · 获赞 92 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/102961927