现在有一个无序序列T,我们现在的需求是寻找其中第k大的一个数字。
这种问题我一般就直接sort然后返回了,但是这里使用减治法,我们可以参考之前的快速排序的思路,先把整个数组从轴值划分,但是不用像快排那样对轴值两边的再次划分,只用对下标判断之后对一边进行划分或者得到结果。
#include<iostream>
#include<vector>
using namespace std;
//查找一个序列中第k大的元素
void Swap(int&a,int&b)
{
int t=a;
a=b;
b=t;
}
int Partition(vector<int>&r,int l,int h)
{
int i=l,j=h;
while(i<j)
{
while(i<j&&r[i]<=r[j])j--;
if(i<j)
Swap(r[i],r[j]),
i++;
while(i<j&&r[i]<=r[j])i++;
if(i<j)
Swap(r[i],r[j]),
j--;
}
return i;
}
int SelectMink(vector<int>&r,int l,int h,int k)
{
int s=Partition(r,l,h);
if(s==k)
return r[s];
if(s>k)
return SelectMink(r,l,s-1,k);
if(s<k)
return SelectMink(r,s+1,h,k);
}
int main ()
{
vector<int>r={5,3,8,1,4,6,9,2,7};
cout<<SelectMink(r,0,r.size()-1,3);
return 0;
}