Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12938
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-08 11:44
文章分类
文章存档

2014年(16)

我的朋友
最近访客

分类: C/C++

2014-09-10 17:31:55


点击(此处)折叠或打开



  1. /*数组中第一个元素存放数组的长度len和当前的元素个数index*/
  2. struct elem {
  3.         union {
  4.                 int left;
  5.                 int index;
  6.         };
  7.         union {
  8.                 int right;
  9.                 int len;
  10.         };
  11. };
  12. int getmin(struct elem *heap)
  13. {
  14.         if (heap->index == 0) {
  15.                 fprintf(stderr, "the heap is empty\n");
  16.                 return INT_MIN;
  17.         }

  18.         return heap[1].left;
  19. }
  20. int getmax(struct elem *heap)
  21. {
  22.         if (heap->index == 0) {
  23.                 fprintf(stderr, "the heap is empty\n");
  24.                 return INT_MAX;
  25.         }
  26.         if (heap->index == 1)
  27.                 return heap[1].left;
  28.         else
  29.                 return heap[1].right;
  30. }
  31. void insert(struct elem *elem, int key)
  32. {
  33.         if (elem->index == elem->len) {
  34.                 fprintf(stderr, "need increase the len\n");
  35.                 return;
  36.         }
  37.         elem->index ++;
  38.         int idx = (elem->index + 1) / 2;
  39.         int idy = (elem->index + 1) % 2;

  40.         if (idy == 0) {
  41.                 elem[idx].left = elem[idx].right = key;
  42.         } else if (elem[idx].left > key) {
  43.                 elem[idx].right = elem[idx].left;
  44.                 elem[idx].left = key;
  45.         } else {
  46.                 elem[idx].right = key;
  47.         }

  48.         int x = idx;
  49.         int z = x / 2;
  50.         int tkey = elem[x].left;
  51.         while (z > 0 && elem[z].left > tkey) {
  52.                 elem[x].left = elem[z].left;
  53.                 x = z;
  54.                 z = x / 2;
  55.         }
  56.         elem[x].left = tkey;

  57.         x = idx;
  58.         z = x / 2;
  59.         tkey = elem[x].right;
  60.         while (z > 0 && elem[z].right < tkey) {
  61.                 elem[x].right = elem[z].right;
  62.                 x = z;
  63.                 z = x / 2;
  64.         }
  65.         elem[x].right = tkey;

  66.         if (idy == 0 && elem[idx].left == key)
  67.                         elem[idx].left = elem[idx].right;
  68. }
  69. void delmin(struct elem *elem)
  70. {
  71.         if (elem->index == 0) {
  72.                 fprintf(stderr, "cant delete an empty heap\n");
  73.                 return;
  74.         }
  75.         if (elem->index == 1) {
  76.                 elem->index --;
  77.                 return;
  78.         }
  79.         int idx = (elem->index + 1) / 2;
  80.         int idy = (elem->index + 1) % 2;
  81.         elem[1].left = idy==0 ? elem[idx].left : elem[idx].right;
  82.         elem->index--;

  83.         int end = (elem->index + 1) / 2 / 2;
  84.         int i = 1;
  85.         while (i <= end) {
  86.                 int k = 2*i;
  87.                 if ((k+1)*2-1 <= elem->index && \
  88.                 elem[k].left > elem[k+1].left) {
  89.                         k ++;
  90.                 }
  91.                 if (elem[i].left > elem[k].left) {
  92.                         int tmp = elem[i].left;
  93.                         elem[i].left = elem[k].left;
  94.                         elem[k].left = tmp;
  95.                         i = k;
  96.                         if (2*k <= elem->index &&\
  97.                         elem[k].left > elem[k].right) {
  98.                                 tmp = elem[k].left;
  99.                                 elem[k].left = elem[k].right;
  100.                                 elem[k].right = tmp;
  101.                         }
  102.                 } else
  103.                         break;
  104.         }
  105. }
  106. void delmax(struct elem *elem)
  107. {
  108.         if (elem->index == 0) {
  109.                 fprintf(stderr, "cannot delete, an empty tree\n");
  110.                 return;
  111.         }
  112.         if (elem->index <= 2) {
  113.                 elem->index--;
  114.                 return;
  115.         }

  116.         int idx = (elem->index+1) / 2;
  117.         int idy = (elem->index+1) % 2;
  118.         elem[1].right = idy==0 ? elem[idx].left : elem[idx].right;
  119.         elem->index --;

  120.         int end = (elem->index + 1) / 2 / 2;
  121.         int i = 1;
  122.         while (i <= end) {
  123.                 int k = 2*i;
  124.                 if ((k+1)*2 <= elem->index &&\
  125.                 elem[k].right < elem[k+1].right) {
  126.                         k++;
  127.                 }

  128.                 if (elem[i].right < elem[k].right) {
  129.                         int tmp = elem[i].right;
  130.                         elem[i].right = elem[k].right;
  131.                         elem[k].right = tmp;

  132.                         if (elem[k].left > elem[k].right) {
  133.                                 tmp = elem[k].left;
  134.                                 elem[k].left = elem[k].right;
  135.                                 elem[k].right = tmp;
  136.                         }
  137.                         i = k;
  138.                  } else
  139.                         break;
  140.         }
  141. }

阅读(524) | 评论(0) | 转发(0) |
0

上一篇:二项树

下一篇:没有了

给主人留下些什么吧!~~