鱼C论坛

 找回密码
 立即注册
查看: 2471|回复: 0

[技术交流] 【C++】基于数组实现的最小堆

[复制链接]
发表于 2017-11-15 11:05:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
初学数据结构,欢迎指正。
  1. #include<iostream>
  2. using namespace std;

  3. template <typename T>
  4. class MinHeap {
  5. private:
  6.         const static int MAX_SIZE = 20;
  7.         const static int EX_SIZE = 20;
  8.         int heapSize;
  9.         int maxSize;
  10.         T *heap;
  11.         void _sort(); // 整体排序
  12.         void _sortUp(int start); // 上滑排序
  13. public:
  14.         MinHeap(int size = MAX_SIZE);
  15.         MinHeap(T arr[], int size);
  16.         ~MinHeap();
  17.         void insert(const T& value); // 插入新结点
  18.         void forShow(); // 遍历数组输出,仅用于测试
  19.         int getSize();
  20.         int getMaxSize();
  21.         bool getTop(T &value);
  22.         bool remove(T &value);
  23.         void remove();
  24.         void makeEmpty();
  25. };

  26. template <typename T>
  27. MinHeap<T>::MinHeap(int size) {
  28.         heap = new T[size];
  29.         maxSize = size;
  30.         heapSize = 0;
  31. }

  32. template <typename T>
  33. MinHeap<T>::MinHeap(T arr[], int size) {
  34.         maxSize = (size > MAX_SIZE) ? size : MAX_SIZE;
  35.         heap = new T[maxSize];
  36.         heapSize = size;
  37.         for (int i = 0; i < size; i++) {
  38.                 heap[i] = arr[i];
  39.         }
  40.         _sort();
  41. }

  42. template <typename T>
  43. MinHeap<T>::~MinHeap() {
  44.         delete[] heap;
  45. }

  46. template <typename T>
  47. void MinHeap<T>::insert(const T& value) {
  48.         if (heapSize == maxSize) {
  49.                 T *hn = new T[maxSize + EX_SIZE];
  50.                 for (int i = 0; i < maxSize; i++) {
  51.                         hn[i] = heap[i];
  52.                 }
  53.                 delete[] heap;
  54.                 heap = hn;
  55.         }
  56.         heap[heapSize] = value;
  57.         _SiftUp(heapSize);
  58.         heapSize++;
  59. }

  60. template <typename T>
  61. void MinHeap<T>::forShow() {
  62.         for (int i = 0; i < heapSize; i++) {
  63.                 cout << heap[i] << endl;
  64.         }
  65. }

  66. template <typename T>
  67. void MinHeap<T>::_sort() {
  68.         int i, j, k;
  69.         T temp;
  70.         for (i = heapSize - 1; i > 0; i--) {
  71.                 k = i;
  72.                 j = (k - 1) / 2;
  73.                 if (heap[k] < heap[j]) {
  74.                         temp = heap[k];
  75.                         heap[k] = heap[j];
  76.                         heap[j] = temp;
  77.                 }
  78.                 j = (k + 1) * 2 - 1;
  79.                 while (j <= heapSize - 1 && heap[k] > heap[j]) {
  80.                         temp = heap[k];
  81.                         heap[k] = heap[j];
  82.                         heap[j] = temp;
  83.                         k = j;
  84.                         j = (j + 1) * 2 - 1;
  85.                 }
  86.         }
  87. }

  88. template <typename T>
  89. void MinHeap<T>::_sortUp(int start) {
  90.         int i = start;
  91.         int j = (i - 1) / 2;
  92.         T temp = heap[i];
  93.         //while中不作交换,只把较大的父节点往下填
  94.         while (i > 0) {
  95.                 if (temp < heap[j]) {
  96.                         heap[i] = heap[j];
  97.                         i = j;
  98.                         j = (i - 1) / 2;
  99.                 }
  100.                 else {
  101.                         break;
  102.                 }
  103.         }
  104.         //填入正确位置
  105.         heap[i] = temp;
  106. }

  107. template <typename T>
  108. int MinHeap<T>::getSize() {
  109.         return heapSize;
  110. }

  111. template <typename T>
  112. int MinHeap<T>::getMaxSize() {
  113.         return maxSize;
  114. }

  115. template <typename T>
  116. bool MinHeap<T>::getTop(T &value) {
  117.         if (heapSize == 0) {
  118.                 return false;
  119.         }
  120.         else {
  121.                 value = heap[0];
  122.                 return true;
  123.         }
  124. }

  125. template <typename T>
  126. bool MinHeap<T>::remove(T &value) {
  127.         if (heapSize == 0) {
  128.                 return false;
  129.         }
  130.         else {
  131.                 value = heap[0];
  132.                 remove();
  133.                 return true;
  134.         }
  135. }

  136. template <typename T>
  137. void MinHeap<T>::remove() {
  138.         if (heapSize == 0) {
  139.                 return;
  140.         }
  141.         heapSize--;
  142.         heap[0] = heap[heapSize];
  143.         _sort();
  144. }

  145. template <typename T>
  146. void MinHeap<T>::makeEmpty() {
  147.         heapSize = 0;
  148. }
复制代码


以下是测试代码
  1. int main() {
  2.         int a[] = {53,17,78,9,45,65,87,23};
  3.         MinHeap<int> h(a,8);
  4.         h.forShow();
  5.         return 0;
  6. }
复制代码


如果T是一个类,要求它必须重载了>、<、>=等运算符
附_sort()和_sortUp()原理图

_sort()

_sort()

_sortUp()

_sortUp()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表