选第k小元素:特定分治策略

本文探讨了如何使用特定的分治策略来解决从n个元素集合中选取第k小元素的问题。通过详细解析、核心伪代码展示及算法复杂度分析,解释了如何有效地找出排序后的第k个元素。
摘要由CSDN通过智能技术生成

1.问题
选择问题:
设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。这里的第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。

2.解析
采用特定分治策略:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.设计
[核心伪代码]

int select(int A[],int left,int right,int k){
   
	int n=right-left;//计算数组规模大小
	if(n<5){
   //数组规模小于5时直接调用二分归并排序输出结果 
		Merge_Sort(A,left,right-1);
		return A[left+k-1];
	} 
	
	//n>5
	int i;
	int t=n/5;//每5个元素分为一组,一共分为t组
	int *p=new int[t];//定义一个指针变量p,开辟一块空间,大小为t个int类型,令p指向这块空间开头 
	for(i=0;i<t;i++){
   //对每个5元组排序,排序后选出中位数数组 
		Merge_Sort(A,left+i*5,left+i*5+4); 
		p[i]=A[left+i*5+2];
	} 
	
	Merge_Sort(p,0,i-1);//对选出的中位数数组再单独排序(不改变上一步的顺序)
	int mid=p[i/2];//求出中位数数组的中位数mid
	int *a1=new int[n];
	int *a2=new int[n];
	int *a3=new int[n];
	int s1=0;
	int s2=0;
	int s3=0;
	for(int<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值