#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;
}
寻找数组中第k小的元素---算法设计与分析的课堂记录
最新推荐文章于 2022-07-05 17:01:04 发布