#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int Partition(vector<int>&data,int headId,int tailId)
{
int posSlow = headId-1,posFast=headId;
for(;posFast<tailId;++posFast)
{
if(data[posFast]<data[tailId])
{
++posSlow;
swap(data[posSlow],data[posFast]);
}
}
++posSlow;
swap(data[posSlow],data[tailId]);
return posSlow;
}
void FindKLeast(vector<int>&data,int headId,int tailId,int k)
{
if(headId<tailId)
{
int midId=Partition(data,headId,tailId);
if(midId>k)
{
FindKLeast(data,headId,midId-1,k);
}
else
{
if(midId<k)
{
FindKLeast(data,midId+1,tailId,k);
}
}
}
}
void FindKLeastNumbers(vector<int>&data,unsigned int k)
{
int len = data.size();
if(k>len)
{
throw new std::exception("Invalid argument!");
}
FindKLeast(data,0,len-1,k);
}
int main()
{
int a[]={12,42,10,31,6,15};
int k=3;
vector<int>::iterator iter;
vector<int> ivector(a,a+6);
FindKLeastNumbers(ivector,k);
cout<<"前k个最小的数为:"<<endl;
for(iter = ivector.begin();iter<=ivector.begin()+k-1;iter++)
cout<<*iter<<" ";
cout<<endl;
}
求前k个最小的数---类似快排思想的O(n)
最新推荐文章于 2023-09-04 22:18:14 发布