20170927_快排应用_数组中寻找最小的K个数

来源:互联网 发布:126邮箱ssl协议端口号 编辑:程序博客网 时间:2024/05/22 15:04

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;}