20170927_快排应用_数组中寻找最小的K个数
在数组中寻找最小的 K 个数:
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最小的4个数是:5,6,7,8
/*在数组中寻找最小的k个数
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最小的4个数是:5,6,7,8
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
class Solution
{
public:
void GetMinKthNumbers(vector<int> &input, vector<int> &res, int k)
{
int n=input.size();
if(k>n || n<=0 || k<=0)
return;
int start=0;
int end=n-1;
int index=partion(input,start,end); //返回的是第(index+1)小元素值
while(index!=k-1)
{
if(index>k-1)
{
end=index-1;
index=partion(input,start,end);
}
else
{
start=index+1;
index=partion(input,start,end);
}
}
for(int i=0; i<k; ++i)
res[i]=input[i];
}
public:
//快速排序的一次划分函数
int partion(vector<int> &input, int start, int end)
{
int n=input.size();
if(n<1)
return -1;
int i=start;
int j=end;
while(i<j)
{
while(i<j && input[i]<=input[j])
--j;
if(i<j)
{
swap(input[i],input[j]);
++i;
}
while(i<j && input[i]<=input[j])
++i;
if(i<j)
{
swap(input[i],input[j]);
--j;
}
}
return i;
}
};
int main(void)
{
//int input[]={4,5,1,6,2,7,3,8};
int ch=0;
vector<int> input;
while(cin>>ch)
input.push_back(ch);
int n=input.size();
cin.clear(); //换行,清除输入缓冲!!!
int k=0;
cin>>k;
vector<int> res(k);
class Solution object;
object.GetMinKthNumbers(input,res,k);
for(auto mem:res)
cout<<mem<<",";
cout<<endl;
system("pause");
return 0;
}