(1)题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
(2)思路
利用堆排序,基本思路是使用数组的前k个元素构建一个大顶堆(自底向上),堆的根结点是较大的值,然后依次将后面的元素与根结点比较,如果数组元素小于根结点,则用该元素替换根结点,自顶向下调整。如果该元素大于根结点,则继续比较数组后面的元素,直到比较完整个数组。
(3)代码
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>vec;
if(k>input.size()||k==0)
{
return vec;
}
int i;
for(i=0;i<k;i++)
{
vec.push_back(input[i]); //将数组中前k个元素存储在数组中
}
for(i=input.size()/2-1;i>=0;i--)
{
heapAdjust(vec,i,k-1); //自下而上构建大顶堆
}
for(i=k;i<input.size();i++)
{
if(input[i]<vec[0])
{
vec[0]=input[i];
heapAdjust(vec, 0, k-1); //自顶向下调整堆
}
}
//排序取出最小的k个数
for(i=k-1;i>0;i--)
{
swap(vec,0,i);
heapAdjust(vec, 0, i-1);
}
return vec;
}
void heapAdjust(vector<int> &arr,int s,int m)
{
int temp=arr[s];
int j;
for(j=2*s+1;j<=m;j=j*2+1)
{
if(j<m&&arr[j+1]>arr[j])
++j;
if(temp>=arr[j])
break;
arr[s]=arr[j];
s=j;
}
arr[s]=temp;
}
void swap(vector<int>&arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
};