最小堆&&最大堆的实现(c++)

本文介绍了最小堆和最大堆的数据结构实现,包括插入、删除等核心操作,并提供了详细的C++模板类实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://blog.youkuaiyun.com/kongbu0622/article/details/4636350


最小堆:

[cpp]  view plain copy
  1. template<class T>  
  2. class MinHeap {  
  3. public:  
  4.     MinHeap(int MinHeapSize = 10);  
  5.     ~MinHeap() {delete [] heap;}  
  6.     int Size() const {return CurrentSize;}  
  7.     T Min() {if (CurrentSize == 0)  
  8.               throw OutOfBounds();  
  9.            return heap[1];}  
  10.     MinHeap<T>& Insert(const T& x);  
  11.     MinHeap<T>& DeleteMin(T& x);  
  12.     void Initialize(T a[], int size, int ArraySize);  
  13.     void Deactivate() {heap = 0;}  
  14.     void Output() const;  
  15. private:  
  16.     int CurrentSize, MaxSize;  
  17.     T *heap;  
  18. };  
  19.   
  20. template<class T>  
  21. MinHeap<T>::MinHeap(int MinHeapSize)  
  22. {  
  23.     MaxSize = MinHeapSize;  
  24.     heap = new T[MaxSize+1];  
  25.     CurrentSize = 0;  
  26. }  
  27.   
  28. template<class T>  
  29. MinHeap<T>& MinHeap<T>::Insert(const T& x)  
  30. {  
  31.     if (CurrentSize == MaxSize)  
  32.         throw NoMem();  
  33.   
  34.     //为x寻找应插入的位置  
  35.     //i从新的叶节点开始,并沿着树上升  
  36.     int i = ++CurrentSize;  
  37.     while (i != 1 && x < heap[i/2])   
  38.     {  
  39.         heap[i] = heap[i/2]; // 将元素下移  
  40.         i /= 2;              // 移向父节点  
  41.     }  
  42.     heap[i] = x;  
  43.   
  44.     return *this;  
  45. }  
  46.   
  47. template<class T>  
  48. MinHeap<T>& MinHeap<T>::DeleteMin(T& x)  
  49. {  
  50.     if (CurrentSize == 0)  
  51.         throw OutOfBounds();  
  52.   
  53.     x = heap[1];  
  54.   
  55.     T y = heap[CurrentSize--]; //最后一个元素  
  56.   
  57.     // 从根开始, 为y寻找合适的位置  
  58.     int i = 1,  // 堆的当前节点  
  59.        ci = 2;  // i的子节点  
  60.   
  61.     while (ci <= CurrentSize)   
  62.     {  
  63.         // 使heap[ci] 是i较小的子节点  
  64.         if (ci < CurrentSize   
  65.           && heap[ci] > heap[ci+1])   
  66.             ci++;  
  67.   
  68.         // 能把y放入heap[i]吗?  
  69.         if (y <= heap[ci])   
  70.             break;  // 能  
  71.   
  72.         // 不能  
  73.         heap[i] = heap[ci]; // 子节点上移  
  74.         i = ci;             // 下移一层  
  75.         ci *= 2;  
  76.     }  
  77.   
  78.     heap[i] = y;  
  79.   
  80.     return *this;  
  81. }  
  82.   
  83. template<class T>  
  84. void MinHeap<T>::Initialize(T a[], int size, int ArraySize)  
  85. {  
  86.    delete [] heap;  
  87.    heap = a;  
  88.    CurrentSize = size;  
  89.    MaxSize = ArraySize;  
  90.   
  91.    // 产生一个最小堆  
  92.    for (int i = CurrentSize/2; i >= 1; i--)   
  93.    {  
  94.         T y = heap[i]; // 子树的根  
  95.   
  96.         // 寻找放置y的位置  
  97.         int c = 2*i; // c 的父节点是y的目标位置  
  98.   
  99.         while (c <= CurrentSize)   
  100.         {  
  101.             // 使heap[c]是较小的子节点  
  102.             if (c < CurrentSize &&  
  103.              heap[c] > heap[c+1]) c++;  
  104.   
  105.             // 能把y放入heap[c/2]吗?  
  106.             if (y <= heap[c]) break;  // 能  
  107.   
  108.             // 不能  
  109.             heap[c/2] = heap[c]; // 子节点上移  
  110.             c *= 2;              // 下移一层  
  111.         }  
  112.   
  113.         heap[c/2] = y;  
  114.     }  
  115. }  
  116.   
  117. template<class T>  
  118. void MinHeap<T>::Output() const  
  119. {  
  120.     cout << "The " << CurrentSize  
  121.         << " elements are"<< endl;  
  122.     for (int i = 1; i <= CurrentSize; i++)  
  123.       cout << heap[i] << ' ';  
  124.     cout << endl;  
  125. }  

 

最大堆:

[cpp]  view plain copy
  1. template<class T>  
  2. class MaxHeap {  
  3. public:  
  4.     MaxHeap(int MaxHeapSize = 10);  
  5.     ~MaxHeap() {delete [] heap;}  
  6.     int Size() const {return CurrentSize;}  
  7.     T Max() {if (CurrentSize == 0)  
  8.               throw OutOfBounds();  
  9.            return heap[1];}  
  10.     MaxHeap<T>& Insert(const T& x);  
  11.     MaxHeap<T>& DeleteMax(T& x);  
  12.     void Initialize(T a[], int size, int ArraySize);  
  13.     void Deactivate() {heap = 0;}  
  14.     void Output() const;  
  15. private:  
  16.     int CurrentSize, MaxSize;  
  17.     T *heap;  
  18. };  
  19.   
  20. template<class T>  
  21. MaxHeap<T>::MaxHeap(int MaxHeapSize)  
  22. {  
  23.     MaxSize = MaxHeapSize;  
  24.     heap = new T[MaxSize+1];  
  25.     CurrentSize = 0;  
  26. }  
  27.   
  28. template<class T>  
  29. MaxHeap<T>& MaxHeap<T>::Insert(const T& x)  
  30. {  
  31.     if (CurrentSize == MaxSize)  
  32.         throw NoMem();  
  33.   
  34.     //为x寻找应插入的位置  
  35.     //i从新的叶节点开始,并沿着树上升  
  36.     int i = ++CurrentSize;  
  37.     while (i != 1 && x > heap[i/2])   
  38.     {  
  39.         heap[i] = heap[i/2]; // 将元素下移  
  40.         i /= 2;              // 移向父节点  
  41.     }  
  42.   
  43.     heap[i] = x;  
  44.     return *this;  
  45. }  
  46.   
  47. template<class T>  
  48. MaxHeap<T>& MaxHeap<T>::DeleteMax(T& x)  
  49. {  
  50.     if (CurrentSize == 0)  
  51.         throw OutOfBounds();  
  52.   
  53.     x = heap[1];  
  54.   
  55.   
  56.     T y = heap[CurrentSize--]; //最后一个元素  
  57.   
  58.     // 从根开始, 为y寻找合适的位置  
  59.     int i = 1,  // 堆的当前节点  
  60.        ci = 2;  // i的子节点  
  61.   
  62.     while (ci <= CurrentSize)  
  63.     {  
  64.         // 使heap[ci] 是i较大的子节点  
  65.         if (ci < CurrentSize   
  66.          && heap[ci] < heap[ci+1])   
  67.             ci++;  
  68.   
  69.         // 能把y放入heap[i]吗?  
  70.         if (y >= heap[ci])   
  71.             break;//能  
  72.   
  73.         //不能  
  74.         heap[i] = heap[ci]; // 子节点上移  
  75.         i = ci;             // 下移一层  
  76.         ci *= 2;  
  77.     }  
  78.   
  79.     heap[i] = y;  
  80.   
  81.     return *this;  
  82. }  
  83.   
  84. template<class T>  
  85. void MaxHeap<T>::Initialize(T a[], int size, int ArraySize)  
  86. {  
  87.     delete [] heap;  
  88.     heap = a;  
  89.     CurrentSize = size;  
  90.     MaxSize = ArraySize;  
  91.   
  92.     // 产生一个最大堆  
  93.     for (int i = CurrentSize/2; i >= 1; i--)   
  94.     {  
  95.         T y = heap[i]; // 子树的根  
  96.   
  97.         // 寻找放置y的位置  
  98.         int c = 2*i; // c 的父节点是y的目标位置  
  99.                   
  100.         while (c <= CurrentSize)   
  101.         {  
  102.             // 使heap[c]是较大的子节点  
  103.             if (c < CurrentSize   
  104.              && heap[c] < heap[c+1])  
  105.                 c++;  
  106.   
  107.             // 能把y放入heap[c/2]吗?  
  108.             if (y >= heap[c])   
  109.                 break;  // 能  
  110.   
  111.             // 不能  
  112.             heap[c/2] = heap[c]; // 子节点上移  
  113.             c *= 2;              // 下移一层  
  114.         }  
  115.         heap[c/2] = y;  
  116.     }  
  117. }  
  118.   
  119. template<class T>  
  120. void MaxHeap<T>::Output() const  
  121. {  
  122.    cout << "The " << CurrentSize   
  123.         << " elements are"<< endl;  
  124.    for (int i = 1; i <= CurrentSize; i++)  
  125.        cout << heap[i] << ' ';  
  126.    cout << endl;  
  127. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值