【算法】寻找K个最大的数组

来源:互联网 发布:海康网络解码器 编辑:程序博客网 时间:2024/05/16 03:33
 1.问题描述:

    有一堆未排序的数,前选择其中最大的K个进行输出。

2.问题解析:

    快速排序:O(nlogn)

   堆排序:O(nlogn)

   但是老师说一般面试的答案是堆排,我也估计会快一些。

3.问题流程:

   堆,是指根节点大于(或小于)其子节点的完全二叉树;最优二叉树是指左子树<根节点<右节点的二叉树。

   先构建一个大根堆,然后取出堆顶元素,将堆顶和堆尾元素互换,维护大根堆。

   建堆的过程是从数组一半,到最开始,每次刷堆。

   刷堆的过程是,记录下待刷元素,然后于其子节点中比较大的那个进行比较,如果子节点大,则互换,并移动父子指针,直到最后。

4.代码:   

void heapSort(int unSort[],int n,int i) {int x=unSort[i];int j=2*i+1;    while(j<=n-1){//×¢ÒâÔ½½çÅжÏif ((j<n-1)&&(unSort[j]<unSort[j+1])) j=j+1;if (unSort[j]>x){unSort[i]=unSort[j];i=j;j=2*i+1;}elsej=n;}unSort[i]=x;}int * SelectKNumber(int unSort[],int k,int length){    int i;int *Sort;Sort=new int[k];  for (i=length/2;i>=0;i--){heapSort(unSort,length,i);}for (i=0;i<k;i++){Sort[i]=unSort[0];unSort[0]=unSort[length-i-1];unSort[length-i-1]=Sort[i];heapSort(unSort,length-i-2,0);}return Sort;}
原创粉丝点击