最小堆类
来源:互联网 发布:氧气听书软件 编辑:程序博客网 时间:2024/06/06 04:23
/*Name: 最小堆类 Copyright: Author: Date: 20-02-17 09:56Description: */#include<iostream>using namespace std;template <typename type> class MinHeap{public: MinHeap(int maxSize); //创建一个容量为maxSize的空堆 MinHeap(const type arr[], int len); //根据长度为len的数组arr构造一个最小堆 ~MinHeap() {delete []heap;} //析构函数 bool IsEmpty() const {return size == 0;} bool IsFull() const {return size == capacity;} type & GetMin() const {return heap[0];} //返回堆顶的最小元素 bool Insert(const type &x); //将x插入到最小堆 bool DeleteMin(); //删除堆顶的最小元素 void DisPlayHeap(); //输出最小堆的所有元素 private:enum {DefaultSize = 99999}; //默认的最大容量 type *heap; //存放堆的元素的数组 int capacity; //堆的容量 int size; //堆的长度,即当前元素个数 void FilterDown(int i); //从下标i到m自顶向下进行调整成为最小堆void FilterUp(int i); //从下标i到0自底向上进行调整成为最小堆};template <typename type> MinHeap<type>::MinHeap(int maxSize){ //先修改maxSize的取值范围 if (maxSize < 0) { maxSize = 0; } else if (maxSize > DefaultSize) { maxSize = DefaultSize; } capacity = maxSize; heap = new type[capacity]; size = 0;}template <typename type> MinHeap<type>::MinHeap(const type arr[], int len){ //先修改len的取值范围 if (len < 0) { len = 0; } else if (len > DefaultSize) { len = DefaultSize; } size = capacity = len; heap = new type[capacity]; for (int i=0; i<len; i++) //先将arr的元素直接复制到heap { heap[i] = arr[i];}//将heap调整为一个最小堆for (int i=(size-1)/2; i>=0; i--){ FilterDown(i); }}template <typename type> void MinHeap<type>::DisPlayHeap() //输出最小堆的所有元素 { cout << "输出堆:"; for (int i=0; i<size; i++) { cout << heap[i] << " ";}cout << endl;}template <typename type> void MinHeap<type>::FilterDown(int i) //从下标i到堆的尾部自顶向下进行调整成为最小堆{ type t = heap[i]; //保存heap[i]的值以备放到适合的位置 int child = i * 2 + 1; //指向左孩子 while (child < size) //有左孩子 { if (child+1 < size && heap[child+1] < heap[child]) //有右孩子,且右孩子更小些,定位其右孩子 child += 1; if (heap[child] < t)//用最小值覆盖其父亲结点的值,即将空位下滤到新的位置 { heap[i] = heap[child]; i = child; child = i * 2 + 1; } else break; } heap[i] = t;}template <typename type> void MinHeap<type>::FilterUp(int i) //从下标i到0自底向上进行调整成为最小堆{ type t = heap[i]; while (i > 0 && heap[i/2] > t) //若比父亲结点小,则用父亲结点的值覆盖该结点,即将空位上滤到新的位置 { heap[i] = heap[i/2]; i /= 2;} heap[i] = t;}template <typename type> bool MinHeap<type>::Insert(const type &x) //将x插入到最小堆{ if (IsFull()) { cerr << "heap is full" << endl; return false; } //从尾部插入并向上调整成最小堆,然后长度增1 heap[size++] = x; FilterUp(size-1); return true;}template <typename type> bool MinHeap<type>::DeleteMin() //删除堆顶的最小元素{ if (IsEmpty()) { cerr << "heap is empty" << endl; return false; } heap[0] = heap[--size];//用尾部元素覆盖顶部元素,然后长度减1 FilterDown(0); //顶部元素向下调整成最小堆 return true;}int main(){ const int size = 10;MinHeap<int> obj_1(size); for (int i=0; i<size; i++) { obj_1.Insert(rand()%51); } obj_1.DisPlayHeap(); //输出最小堆的所有元素 int arr[8] = {3,5,2,7,9,6,8,1};MinHeap<int> obj_2(arr, 8);obj_2.DisPlayHeap(); //输出最小堆的所有元素 cout << "最小值:" << obj_2.GetMin() << endl; obj_2.DeleteMin(); obj_2.DisPlayHeap(); //输出最小堆的所有元素 system("pause"); return 0;}
0 0
- 最小堆类
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最小堆
- 最大堆/最小堆
- 最小堆。最大堆。
- 最大堆/最小堆
- 最大堆/最小堆
- 【前端】-Dom
- leetcode 84 Remove Duplicates from Sorted List II
- 快速理解单件SINGLETON模式
- Android官方数据绑定框架DataBinding
- android 三剑客(Retrofit 2.0)简单使用
- 最小堆类
- MySQL学习指南
- View的measure, layout, draw整个过程
- Unity中的ForceMode——纠正《UnityAPI解析——陈泉宏》一书 关于ForceMode的注解
- python绘图资料整合【更新中...】
- iOS Header File 和 PCH File的区别
- H5场景动画 swiper Animate使用方法
- 各种图回路性质及判定
- JMeter场景设置与监控