寻找数组中第k小的元素---算法设计与分析的课堂记录

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

const int maxN=10010;
int b[maxN];
int M[maxN];//储存中项 
int A1[maxN];
int A2[maxN];
int A3[maxN];

//函数实现的功能是可以返回int数组中第k小的元素
int select(int a[maxN],int low,int high,int k)
{
	int p=high-low+1;
	if(p<44)//如果元素个数小于44个,那么以下的算法就没有必要,因为时间复杂度反而更高 
	{
		sort(a,a+p);
		return a[k];
	}
	else
	{
		int q=p/5;//五个为一组,组内分别排序 
		int x=q/2+1;
		for(int i=0;i<q;i++)
		{
			sort(a+5*i,a+4+5*i);
			M[i]=a[2+5*i];
		}
		int mm=select(M,0,q-1,ceil(q/2));//取每个组的中间项再取中间项,并且依据这个中间项分组(三个组,大于,小于,等于) 
		int a1=0,a2=0,a3=0;
		for(int i=0;i<=high;i++)
		{
			if(a[i]<mm)
			{
				A1[a1]=a[i];
				a1++;
			}
			else if(a[i]==mm)
			{
				A2[a2]=a[i];
				a2++;
			}
			else
			{
				A3[a3]=a[i];
				a3++;
			}
		}
		//那么很显然,k就在三个分组之间了 
		if(a1>=k) return select(A1,0,a1-1,k);
		else if(a1+a2>=k) return mm;
		else if(a1+a2<k) return select(A3,0,a3-1,k-a1-a2);
		else return -1;
	}
}

int main()
{
	freopen("寻找第.txt","r",stdin);
	for(int i=0;i<50;i++)
	{
		cin>>b[i];
	}
	int ans=select(b,0,49,44);
	cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值