#include<iostream>
using namespace std;
/*构建一个小顶堆*/
void heapRebuild(int arr[],int size,int root)
{
int leftChild=2*root+1;
int minChild=leftChild;
if(leftChild<=size-1)
{
int rightChild=leftChild+1;
if(rightChild<=size-1 && arr[rightChild]<arr[leftChild])
minChild=rightChild;
if(arr[root]>arr[minChild]){
swap(arr[root],arr[minChild]);
heapRebuild(arr,size,minChild);
}
}
}
/*堆排序*/
void heapSort(int arr[],int size){
for(int i=size/2-1;i>=0;i--)
{
heapRebuild(arr,size,i);
}
for(int last=size-1;last>0;last--){
swap(arr[0],arr[last]);
heapRebuild(arr,last,0);
}
}
/*用堆排序的思想,寻找前K大个数*/
void FindKMAx(int arr[],int size, int k)
{
for(int i=k/2-1;i>=0;i--)
{
heapRebuild(arr,k,i);
}
for(int j=k;j<size;j++){
if(arr[j]>arr[0])
{
swap(arr[0],arr[j]);
heapRebuild(arr,k,0);
}
}
}
int main()
{
int arr[]={1,2,3,10,8,4,5,6,7};
int size=sizeof(arr)/sizeof(arr[0]);
for(int i=0; i<size; i++)
{
cout<<" "<<arr[i];
}
int k=5;
FindKMAx(arr,size,5);
cout<<endl<<"Top"<<k<<":"<<endl;
for(int i=0; i<k; i++)
{
cout<<" "<<arr[i];
}
}