[算法 笔记]大根堆

View Code
  1 /**
  2  * 大根堆。从STL中获得。
  3  */
  4 
  5 #include <iostream>
  6 #include <ctime>
  7 #include <cmath>
  8 #include <cstdlib>
  9 
 10 using namespace std;
 11 
 12 void _push_heap(int *start, int holeIndex, int topIndex, int value)
 13 {
 14     int parent = (holeIndex - 1) / 2;
 15     while (holeIndex > topIndex  && *(start + parent) < value)
 16     {
 17         *(start + holeIndex) = *(start + parent);
 18         holeIndex = parent;
 19         parent = (holeIndex - 1) / 2;
 20     }
 21     *(start + holeIndex) = value;
 22 }
 23 
 24 void adjust_heap(int *start, int holeIndex, int length, int value)
 25 {
 26     int topIndex = holeIndex;
 27     int secondChild = 2 * holeIndex + 2;
 28 
 29     while (secondChild < length)
 30     {
 31         // 大根堆的调整
 32         if (*(start + secondChild) < *(start + secondChild - 1))
 33             secondChild--;
 34         *(start + holeIndex) = *(start + secondChild);
 35         holeIndex = secondChild;
 36         secondChild = 2 * holeIndex + 2;
 37     }
 38 
 39     if (secondChild == length) {
 40         *(start + holeIndex) = *(start + secondChild - 1);
 41         holeIndex = secondChild - 1;
 42     }
 43 
 44     _push_heap(start, holeIndex, topIndex, value);
 45 }
 46 
 47 
 48 void push_heap(int *start, int *end)
 49 {
 50     _push_heap(start, start - end - 1, 0, *(end - 1));
 51 }
 52 
 53 int pop_heap(int *start, int *end)
 54 {
 55     int result = *start;
 56     adjust_heap(start, 0, end - start, *(end - 1));
 57 
 58     return result;
 59 }
 60 
 61 void make_heap(int *start, int *end)
 62 {
 63     if (end - start < 2) return ;
 64     int length = end - start;
 65     int parent = (length - 2) / 2;
 66 
 67     while (true) {
 68         adjust_heap(start, parent, length, *(start + parent));
 69         if (parent == 0) return;
 70         parent--;
 71     }
 72 }
 73 
 74 void sort_heap(int *start, int *end)
 75 {
 76     while (end - start > 1)
 77         cout << pop_heap(start, end--) << "\t" ;
 78 }
 79 
 80 int test(void)
 81 {
 82     enum {maxsize = 500};
 83     int a[maxsize], i;
 84     srand((int)time(0));
 85 
 86     cout << "test array: " << endl;
 87     for (i = 0; i < maxsize; i++)
 88     {
 89         a[i] = rand();
 90         cout << a[i] << "\t";
 91     }
 92     int size = sizeof(a) / sizeof(int);
 93     cout << endl << endl;
 94     cout << "result: " << endl;
 95 
 96     make_heap(a, a + size);
 97     sort_heap(a, a + size);
 98 
 99     return 0;
100 }
101 
102 int main()
103 {
104     test();
105 
106     return 0;
107 }

  

原文地址:https://www.cnblogs.com/life91/p/3013166.html