#include<iostream>
#include<algorithm>
#include<time.h>
#include<vector>
using namespace std;
#define NUMBER 10
//求一个数组中的第k大数字
int findKth(int* num,int start,int ended,int k)
{
if(start==ended&&k==1)
return num[start];
int key=num[start];
int low=start;
int high=ended;
while(low<high)
{
while(low<high&&num[high]>=key)
high--;
while(low<high&&num[low]<=key)
low++;
if(low<high)
swap(num[low],num[high]);
}
swap(num[low],key);
if(low==(NUMBER-k))
return num[low];
if(low<(NUMBER-k))
return findKth(num,low+1,ended,k);
else
return findKth(num,start,low-1,k);
}
int main()
{
int num[NUMBER];
srand(time(NULL));
int k=4;
for(int i=0;i<5;i++)
{
cout<<"第"<<i+1<<"组测试数据: "<<endl;
for(int i=0;i<NUMBER;i++)
{
num[i]=rand()%30;
cout<<num[i]<<" ";
}
cout<<endl;
cout<<"第"<<k<<"大数为: "<<findKth(num,0,9,k)<<endl;
for(int i=0;i<NUMBER;i++)
{
//num[i]=rand()%30;
cout<<num[i]<<" ";
}
vector<int> v(num,num+NUMBER);
nth_element(v.begin(),v.begin()+NUMBER-k,v.end());
cout<<"真实第"<<k<<"大数为: "<<*(v.begin()+NUMBER-k)<<endl;
cout<<endl;
}
/*
int a[]={22,30,30,17,33,40,17,23,22,12,20};
vector<int> iv(a,a+11);
cout<<*(iv.begin()+5)<<endl;
nth_element(iv.begin(),iv.begin()+5,iv.end());
*/
return 0;
}
数组中第k大的数
最新推荐文章于 2022-02-11 12:06:35 发布