编程练习——堆Heap

因为vs2005中c++的Heap构造 _ 有些问题 _
,所以才重写了heap类。

不知道vs2008中这个是不是个bug。

  1. /* created by chico chen
  2. *  date 2008/10/25
  3. */
  4. template< class T, class Cmp>
  5. class Heap
  6. {
  7. private :
  8. vector heap;
  9. void ShiftDown( int index)
  10. {
  11. while (!IsLeaf(index))
  12. {
  13. int l = Lchild(index);
  14. int r = Rchild(index);
  15. if (r != -1)
  16. {
  17. if (Cmp::Up(heap[r],heap[l]))
  18. {
  19. // put the up node to the left
  20. swap(heap[l],heap[r]);
  21. }
  22. }
  23. if (Cmp::Up(heap[l],heap[index]))
  24. {
  25. // up the left child
  26. swap(heap[l],heap[index]);
  27. index = l;
  28. }
  29. else
  30. {
  31. break ;
  32. }
  33. }
    1. }
  34. void ShiftUp( int index)
  35. {
  36. int parent = -1;
  37. while (index != 0)
  38. {
  39. parent = Parent(index);
  40. if (Cmp::Up(heap[index],heap[parent]))
  41. {
  42. swap(heap[index],heap[parent]);
  43. index = parent;
  44. }
  45. else
  46. {
  47. break ;
  48. }
  49. }
    1. }
  50. void ReHeapAll()
  51. {
  52. for ( int i=Parent(heap.size()-1); i>= 0; i–)
  53. {
  54. ShiftDown(i);
  55. }
  56. }
  57. void ReHeapOne( int index)
  58. // set one prior and re-position the index node
  59. {
  60. T data = heap[index];
  61. ShiftDown(index);
  62. if (Cmp::Eq(data,heap[index]))
  63. {
  64. ShiftUp(index);
  65. }
  66. }
  67. int Parent( int index)
  68. // parent node of the index node
  69. {
  70. return (index-1)/2;
  71. }
  72. int Lchild( int index)
  73. // Left child of the index node
  74. {
  75. if (!IsLeaf(index))
  76. return index*2+1;
  77. return -1;
  78. }
  79. int Rchild( int index)
  80. // Right child of the index node
  81. {
  82. if (!IsLeaf(index))
  83. {
  84. int r= index*2+2;
  85. if (r<heap.size())
  86. return r;
  87. }
  88. return -1;
  89. }
    1. int IsLeaf( int index)
  90. {
  91. assert(index < heap.size());
  92. if (heap.size() == 1)
  93. return true ;
  94. int lastNode = Parent(heap.size()-1);
  95. return lastNode < index;
  96. }
    1. int FindData(T& data)
  97. {
  98. int len = heap.size();
  99. for ( int i = 0; i < len; i++)
  100. {
  101. if (Cmp::Eq(data,heap[i]))
  102. {
  103. return i;
  104. }
  105. }
  106. return -1; // can not find the data
  107. }
    1. void printTree( int index, int count)
  108. {
  109. if (index < heap.size() && index >=0)
  110. {
    1. printTree(Rchild(index),count+4);
  111. for ( int i = 0; i < count; i++)
  112. {
  113. cout << " " ;
  114. }
  115. cout <<heap[index]<<endl;
  116. printTree(Lchild(index),count+4);
  117. }
  118. }
  119. public :
  120. Heap()
  121. {
  122. heap = vector();
  123. }
  124. ~Heap()
  125. {
  126. // heap destroyed
  127. }
  128. bool IsEmpty()
  129. {
  130. return heap.size() == 0;
  131. }
        1. void Insert(T& data)
  132. {
  133. heap.push_back(data);
  134. ShiftUp(heap.size()-1);
  135. }
  136. void Delete( int index)
  137. {
  138. int last = heap.size()-1;
  139. if (index>=0 && index <= last)
  140. {
    1. swap(heap[index],heap[last]);
  141. heap.pop_back();
  142. ReHeapOne(index);
  143. }
  144. }
  145. void Delete(T& data)
  146. {
  147. int index = FindData(data);
  148. if (index != -1)
  149. Delete(index);
  150. }
      1. void RemoveTop()
  151. {
    1. if (!IsEmpty()&&heap.size()>1)
  152. {
  153. swap(heap[0],heap[heap.size()-1]);
  154. heap.pop_back();
  155. ShiftDown(0);
  156. }
  157. else if (heap.size() == 1)
  158. {
  159. heap.pop_back();
  160. }
    1. }
  161. T& Top()
  162. {
  163. return heap[0];
  164. }
    1. void Print()
  165. {
  166. printTree(0,1);
  167. }
        1. };