题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
这一题很简单的想到了堆排序,堆排序就是每次归位一个最大值/最小值,直接上代码,堆排序。
void MaxHeap(int a[],int n)
{
//数组辅组,找到第一个有孩子的节点
for(int i=n/2-1;i>=0;i--){
int l=i*2+1,r=i*2+2; //下标从0开始
int temp=l; //肯定会有个左孩子
if(r<n){ //如果有右孩子
temp=(a[l]<a[r])?l:r;
}
if(a[temp]<a[i]){
int x=a[temp];
a[temp]=a[i];
a[i]=x;
}
}
}
void Heapsort(int a[],int n,int k)
{
//建成大根堆
MaxHeap(a,n);
//每次替换,减小长度,得到由小到大的序列
for(int i=0;i<k;i++){
int x=a[0];
a[0]=a[n-1];
a[n-1]=x;
MaxHeap(a,--n);
}
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> ans;
int n=input.size();
if(k>n) return ans; //段错误,注意需要判断,k值必须小于数组长度
int a[n];
for(int i=0;i<n;i++){
a[i]=input[i];
}
Heapsort(a,n,k);
for(int i=0;i<k;i++){
ans.push_back(a[n-1-i]);
}
return ans;
}