#include <ctime>
#include <iostream>
#include <vector>
using namespace std;
void init(vector<int>& v, int n) //初始化,产生n个随机数
{
srand((unsigned)time(NULL));
for (int i = 0; i<n; i++)
{
int j=rand()%1000+1;
v.push_back(j);
}
}
void output(vector<int>& v)
{
for(vector<int>::iterator iter=v.begin(); iter!=v.end(); iter++)
cout<<*iter<<" ";
cout<<endl;
}
void insertion(vector<int>& v, int start, int size) //插入排序
{
for(int i=start+1; i<start+size; i++)
{
int temp=v[i];
int j=i-1;
while(j>=start && v[i]<v[j])
j--;
for(int n=i-1; n>=j+1; n--)
v[n+1]=v[n];
v[j+1]=temp;
}
}
int partition(vector<int> &v, int s, int e, int pos) //根据位置pos进行划分
{
int temp=v[pos];
v[pos]=v[e];
v[e]=temp;
int insert_u=s-1;
for(int i=s; i<e; i++)
{
if(v[i]<v[e])
{
int temp=v[++insert_u];
v[insert_u]=v[i];
v[i]=temp;
}
}
temp=v[e];
v[e]=v[++insert_u];
v[insert_u]=temp;
return insert_u;
}
int find_median(vector<int>& v, int s, int e) //递归调用寻找中位数
{
if(s==e)
return v[s];
int index;
vector<int>median;
for(index=s; index<e-5; index+=5)
{
insertion(v, index, 5);
median.push_back(v[index+2]);
}
int remain_num=(e-s+1)%5; //处理剩余元素
if(remain_num>0)
{
insertion(v, index, remain_num);
median.push_back(v[index+remain_num/2]);
}
int judge=(e-s+1)/5; //如果元素不到5个,返回,否则继续递归
if(judge<=0)
return median[0];
else return find_median(median, 0, median.size());
}
int find_index(vector<int>& v, int s, int e, int median) //寻找中位数的所在位置
{
for (int i = s; i<=e; i++)
{
if (v[i] == median)
return i;
}
return -1;
}
int select(vector<int>& v, int s, int e, int kth) //第k个顺序排序元素
{
int k=find_median(v, s, e);
int pos=find_index(v, s, e, k);
int i=partition(v, s, e, pos);
int m=i+1;
if(m==kth)
return v[i];
else if(k>kth)
return select(v, s, k-1, kth);
else return select(v, k+1, e, kth-m);
}
void main()
{
vector<int> v;
init(v, 200);
output(v);
cout<<"please enter the nth:"<<endl;
int nth;
cin>>nth;
int res=select(v, 0, v.size(), nth);
cout<<res<<endl;
}