版权声明:转载请注明出处即可 https://blog.csdn.net/qq_35170212/article/details/81365308
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
手撕:
#include<iostream>
#include<vector>
using namespace std;
//快排核心partition
int myPartition(vector<int>& vr,int beg,int end){
int left=beg;
int right=end;
int cur=vr[beg];
while(left<right){
while(right>left&&vr[right]>=cur)right--;
swap(vr[right],vr[left]);
while(left<right&&vr[left]<=cur)left++;
swap(vr[left],vr[right]);
}
vr[left]=cur;
return left;
}
//快排
void quickSort(vector<int>& vr,int beg,int end){
if(end>beg){
int mid=myPartition(vr,beg,end);
quickSort(vr,beg,mid);
quickSort(vr,mid+1,end);
}
}
//本题
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
int size=input.size();
if(size&&k>0&&k<=size){
int beg=0;
int end=size-1;
int t=k;
int mid=-1;
while(mid!=t-1){
mid=myPartition(input,beg,end);
if(mid==t-1){
for(int i=0;i<k;++i){
res.push_back(input[i]);
}
break;
}else if(mid>t-1){
end=mid;
}else{
beg=mid;
t=t-(mid+1);
}
}
}
return res;
}
测试:
int main(){
int a[]={4,5,1,6,2,7,3,8};
vector<int>vr(a,end(a));
GetLeastNumbers_Solution(vr,4);
return 0;
}