[关闭]
@CrazyHenry 2018-03-15T09:19:41.000000Z 字数 1932 阅读 1108

0.x 17.索引堆

dddd数据结构课本


  1. #include <iostream>
  2. #include <cassert>
  3. #include "SortTestHelper.h"
  4. using namespace std;
  5. // 最大索引堆
  6. template<typename Item>
  7. class IndexMaxHeap{
  8. private:
  9. Item *data; // 最大索引堆中的数据
  10. int *indexes; // 最大索引堆中的索引
  11. int count;
  12. int capacity;
  13. // 索引堆中, 数据之间的比较根据data的大小进行比较, 但实际操作的是索引
  14. void shiftUp( int k ){
  15. while( k > 1 && data[indexes[k/2]] < data[indexes[k]] ){
  16. swap( indexes[k/2] , indexes[k] );
  17. k /= 2;
  18. }
  19. }
  20. // 索引堆中, 数据之间的比较根据data的大小进行比较, 但实际操作的是索引
  21. void shiftDown( int k ){
  22. while( 2*k <= count ){
  23. int j = 2*k;
  24. if( j + 1 <= count && data[indexes[j+1]] > data[indexes[j]] )
  25. j += 1;
  26. if( data[indexes[k]] >= data[indexes[j]] )
  27. break;
  28. swap( indexes[k] , indexes[j] );
  29. k = j;
  30. }
  31. }
  32. public:
  33. // 构造函数, 构造一个空的索引堆, 可容纳capacity个元素
  34. IndexMaxHeap(int capacity){
  35. data = new Item[capacity+1];
  36. indexes = new int[capacity+1];
  37. count = 0;
  38. this->capacity = capacity;
  39. }
  40. ~IndexMaxHeap(){
  41. delete[] data;
  42. delete[] indexes;
  43. }
  44. // 返回索引堆中的元素个数
  45. int size(){
  46. return count;
  47. }
  48. // 返回一个布尔值, 表示索引堆中是否为空
  49. bool isEmpty(){
  50. return count == 0;
  51. }
  52. // 向最大索引堆中插入一个新的元素, 新元素的索引为i, 元素为item
  53. // 传入的i对用户而言,是从0索引的
  54. void insert(int i, Item item){
  55. assert( count + 1 <= capacity );
  56. assert( i + 1 >= 1 && i + 1 <= capacity );
  57. i += 1;
  58. data[i] = item;
  59. indexes[count+1] = i;
  60. count++;
  61. shiftUp(count);
  62. }
  63. // 从最大索引堆中取出堆顶元素, 即索引堆中所存储的最大数据
  64. Item extractMax(){
  65. assert( count > 0 );
  66. Item ret = data[indexes[1]];
  67. swap( indexes[1] , indexes[count] );
  68. count--;
  69. shiftDown(1);
  70. return ret;
  71. }
  72. // 从最大索引堆中取出堆顶元素的索引
  73. int extractMaxIndex(){
  74. assert( count > 0 );
  75. int ret = indexes[1] - 1;
  76. swap( indexes[1] , indexes[count] );
  77. count--;
  78. shiftDown(1);
  79. return ret;
  80. }
  81. // 获取最大索引堆中的堆顶元素
  82. Item getMax(){
  83. assert( count > 0 );
  84. return data[indexes[1]];
  85. }
  86. // 获取最大索引堆中的堆顶元素的索引
  87. int getMaxIndex(){
  88. assert( count > 0 );
  89. return indexes[1]-1;
  90. }
  91. // 获取最大索引堆中索引为i的元素
  92. Item getItem( int i ){
  93. assert( i + 1 >= 1 && i + 1 <= capacity );
  94. return data[i+1];
  95. }
  96. // 将最大索引堆中索引为i的元素修改为newItem
  97. void change( int i , Item newItem ){
  98. i += 1;
  99. data[i] = newItem;
  100. // 找到indexes[j] = i, j表示data[i]在堆中的位置
  101. // 之后shiftUp(j), 再shiftDown(j)
  102. for( int j = 1 ; j <= count ; j ++ )
  103. if( indexes[j] == i ){
  104. shiftUp(j);
  105. shiftDown(j);
  106. return;
  107. }
  108. }
  109. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注