Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50734
  • 博文数量: 27
  • 博客积分: 716
  • 博客等级: 上士
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-31 11:12
文章分类

全部博文(27)

文章存档

2012年(8)

2011年(19)

我的朋友

分类: C/C++

2011-10-06 16:38:46

  1. #include <stdio.h>

  2. #define LEFT(i) i*2
  3. #define RIGHT(i) i*2+1

  4. void max_heapify(int array[], int i, int heap_size)
  5. {
  6.     int l, r, largest, tmp;

  7.     l = LEFT(i); r = RIGHT(i);
  8.     if(l <= heap_size && array[l] > array[i] && array[l] > array[r])
  9.         largest = l;
  10.     else
  11.         largest = i;

  12.     if(r <= heap_size && array[r] > array[i] && array[r] > array[l])
  13.         largest = r;

  14.     if(largest != i) {
  15.         tmp = array[i];
  16.         array[i] = array[largest];
  17.         array[largest] = tmp;

  18.         max_heapify(array,largest,heap_size);
  19.     }
  20. }

  21. void build_max_heap(int array[], int heap_size)
  22. {
  23.     int index;

  24.     for(index = heap_size/2; index >= 1; index--) {
  25.         max_heapify(array,index,heap_size);
  26.     }
  27. }

  28. void heap_sort(int array[], int heap_size)
  29. {
  30.     int i, tmp;
  31.     build_max_heap(array,heap_size);

  32.     for(i = heap_size; i >= 1; i--) {
  33.         tmp = array[i];
  34.         array[i] = array[1];
  35.         array[1] = tmp;

  36.         heap_size--;
  37.         max_heapify(array,1,heap_size);
  38.     }
  39. }

  40. int main()
  41. {
  42.     int index;
  43.     int array[6] = {0,1,5,2,4,3};

  44.     for(index = 1; index < 6; index++) {
  45.         printf("%2d",array[index]);
  46.     }
  47.     printf("\n");

  48.     heap_sort(array,5);

  49.     for(index = 1; index < 6; index++) {
  50.         printf("%2d",array[index]);
  51.     }
  52.     printf("\n");

  53. }
  54.  复杂度:O(nlgn)
  55.          建堆:O(n), 调整:(n-1)*O(lgn)
阅读(568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~