最小堆求解第Kth大的数

最小堆
最小堆是一种完全二叉树,特点是根节点比两个子节点都小
在这里插入图片描述
比如在20个元素中求第8大的数怎么做呢?
利用最小堆的特性构建大小为8的最小堆(比如用前8个元素)如上图,再将接下来十二个元素分别与堆头作比较,如果大于则取代之插入进来并刷新最小堆,小于则直接下一位。全部遍历后。最后的堆头即是我们的第8大的数。因为其他的元素都比堆头小,比堆头大的数都在堆头下面。

//(2)	The function is to find the Kth largest integer from a list A of N(>K) integers.
  The function BuildMinHeap(H, K) is to arrange integers H[1] ... H[K] into a min-heap.


int FindKthLargest ( int A[], int N, int K )
{
  int *H, i, next, child;

  H = (int *)malloc(++N, sizeof(int));
  for ( i=1; i<N; i++ ) H[i] = A[i-1];
  BuildMinHeap(H, K);

  for ( next=K+1; next < N; next++ ) {
    H[0] = H[next];
    if ( H[0] > H[1] ) {
      for ( i=1; i*2 <= K; i=child ) {
        child = i*2;
        if ( child!=K && ①________H[child]>H[child+!]__________) child++;//找到子节点较小的
        if (②___________H[0]>H[child]_______)
          H[i] = H[child];//孩子节点较小的取代他的父节点空出位置
        else   break;
      }
      ③____H[i]=H[0]__________;//待插入节点插入进来
    }
  }
  return ④__H[1]____;//返回第Kth Largest integer
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值