Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69809
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:45:49

练手代码,codepad.org已验证。
该算法为海量数据的求第k大的数的解法之一。
建立大小为k的最小堆,每输入一个数,如果比堆顶大,那么替换堆顶元素,然后维护最小堆的特性。
堆顶元素即为第k大的数。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>

  4. #define LEFT(a) ((a)<<1)+1
  5. #define RIGHT(a) ((a)<<1)+2
  6. #define SWAP(a,b) a^=b;b^=a;a^=b;

  7. int heapcount;
  8. int* initialHeap(int k){
  9.     int * heap = (int*)malloc(sizeof(int)*k);
  10.     heapcount = 0;
  11.     return heap;
  12. }
  13. void MinHeapify(int *heap, int heapsize, int tar){
  14.     assert(heap!=NULL);
  15.     int min = tar;
  16.     if(RIGHT(tar)<heapsize && heap[RIGHT(tar)] < heap[min])
  17.         min = RIGHT(tar);
  18.     if(LEFT(tar)<heapsize && heap[LEFT(tar)] < heap[min])
  19.         min = LEFT(tar);
  20.     if(min != tar){
  21.          SWAP(heap[min],heap[tar]);
  22.          MinHeapify(heap, heapsize, min);    
  23.     }         
  24. }
  25. void buildHeap(int *input, int k){
  26.     assert(input!=NULL);    
  27.     int i;
  28.     for(i = (k-1)>>1 ; i>=0; i--){
  29.         MinHeapify(input, k, i);
  30.     }
  31. }
  32. void append(int *heap, int k, int cur){
  33.     assert(heap!=NULL);
  34.     if(heapcount<k){
  35.         heap[heapcount++] = cur;
  36.         if(heapcount == k){
  37.             buildHeap(heap,k);
  38.             heapcount++;
  39.             }
  40.         }
  41.     else{
  42.         if(cur>heap[0]){
  43.             heap[0] = cur;
  44.             MinHeapify(heap,k,0);
  45.         }
  46.     }
  47. }



  48. int main(){
  49.     int k = 3;
  50.     int input[] = {3,1,5,7,3,4,9,4,10};
  51.     int *heap = initialHeap(k);
  52.     int i;
  53.     for(i = 0;i<sizeof(input)/sizeof(int);i++){
  54.         append(heap, k, input[i]);
  55.     }    
  56.     printf("finial = %d \n", heap[0]);
  57. }

阅读(209) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~