利用堆排序求数组中最小的k个数:
void adjustHeap(vector<int> &arr,int N,int i)
{
///构建小顶堆
int j = 2*i;
if(j<N && arr[j+1]<arr[j])
j++;
if(j<N && arr[j]<arr[i])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
adjustHeap(arr,N,j);
}
}
vector<int> heapSort(vector<int> &arr,int N,int k)
{
vector<int> result;
for(int i=N/2-1;i>=0;i--)
adjustHeap(arr,N,i);
///只循环k次,每次讲堆顶的数取出
for(int i=N-1;i>k;i--)
{
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
result.push_back(arr[i]);
adjustHeap(arr,i,0);
}
return result;
}
int main()
{
int a[8] = {9,20,-3,43,21,555,-210,90};
vector<int> arr(a,a+8);
cout<<"排序前:\n";
for(int i=0;i<8;i++)
cout<<arr[i]<<" ";
cout<<endl;
///假设求最小的3个数
vector<int>result = heapSort(arr,8,3);
cout<<"排序后:\n";
for(int i=0;i<3;i++)
cout<<result[i]<<" ";
cout<<endl;
system("pause");
return 0;
}