Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99001
  • 博文数量: 20
  • 博客积分: 648
  • 博客等级: 上士
  • 技术积分: 222
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-02 11:43
文章分类

全部博文(20)

文章存档

2013年(3)

2012年(8)

2011年(7)

2010年(2)

我的朋友

分类: C/C++

2011-03-25 14:17:14

堆排序:
堆排序分为三个步骤:
1.HEAPIFY(堆化,将指定的数据区调整成一个堆)
2.BUILD_HEAP(建堆,将整块数据建成一个堆)
3.HEAPSORT(排序,调整堆)
伪码:

Heapify (A, i)

  1. l left [i]
  2. r right [i]
  3. if l ≤ heap-size [A] and A[l] > A[i]
  4.     then largest l
  5.     else largest i
  6. if r ≤ heap-size [A] and A[i] > A[largest]
  7.     then largest r
  8. if largest  ≠ i
  9.     then exchange A[i] A[largest]
  10.         Heapify (A, largest)

BUILD_HEAP (A)

  1. heap-size (A) length [A]
  2. For i ←  floor(length[A]/2) down to 1 do
  3.         Heapify (A, i)

HEAPSORT (A)

  1. BUILD_HEAP (A)
  2. for i length (A) down to 2 do
    exchange A[1] A[i]
    heap-size [A] heap-size [A] - 1
    Heapify (A, 1)

  1. void heapSort(int numbers[], int array_size)
  2.     {
  3.       int i, temp;

  4.       for (i = (array_size / 2)-1; i >= 0; i--)
  5.         siftDown(numbers, i, array_size);

  6.       for (i = array_size-1; i >= 1; i--)
  7.       {
  8.         temp = numbers[0];
  9.         numbers[0] = numbers[i];
  10.         numbers[i] = temp;
  11.         siftDown(numbers, 0, i-1);
  12.       }
  13.     }


  14.     void siftDown(int numbers[], int root, int bottom)
  15.     {
  16.       int done, maxChild, temp;

  17.       done = 0;
  18.       while ((root*2 <= bottom) && (!done))
  19.       {
  20.         if (root*2 == bottom)
  21.           maxChild = root * 2;
  22.         else if (numbers[root * 2] > numbers[root * 2 + 1])
  23.           maxChild = root * 2;
  24.         else
  25.           maxChild = root * 2 + 1;

  26.         if (numbers[root] < numbers[maxChild])
  27.         {
  28.           temp = numbers[root];
  29.           numbers[root] = numbers[maxChild];
  30.           numbers[maxChild] = temp;
  31.           root = maxChild;
  32.         }
  33.         else
  34.           done = 1;
  35.       }
  36.     }



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

上一篇:排序-归并

下一篇:排序-快排

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