【day-11】寻找前K大个数-堆排序

来源:互联网 发布:数据库注释注入防护 编辑:程序博客网 时间:2024/06/04 17:58
#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];    }}

1 0