C++实现二叉堆

来源:互联网 发布:批发衣服软件 编辑:程序博客网 时间:2024/05/21 17:26
#include<iostream>using namespace std;#define MAXZ 100#define RES 10class heap {int *T;int cap;int len;public:heap();heap(int);~heap();void up(int);void down(int,int);void interts(int);int remove(int);void show();int get_ind(int);};heap::heap(){len = 0;cap = MAXZ;T = new int[cap];}heap::heap(int n) {len = 0;cap = n + MAXZ;T = new int[cap];}heap::~heap(){len = 0;cap = 0;delete[] T;}int heap :: get_ind(int e){int i;for (i = 1; i <= len; ++i)if (T[i]==e)return i;if (i > len)return -1;}void heap::up(int e){int tmp = T[e];//存下要移动节点的值int now = e;//当前节点下标nowint f = (e / 2);//父节点下标fwhile (now > 1)//如果now>1,即没有移动到父节点,则继续寻找{if (T[f] > tmp)//如果父节点大于了该点,则找到了正确的位置,查找结束break;else//如果小于了{T[now] = T[f];//交换值now = f;//并将下标往上移动到原父节点的位置f = (f / 2);//并且寻找新的父节点}}T[now] = tmp;//最后再将我们的值传给正确的位置}void heap::down(int s,int t){int tmp = T[s];int now = s;int l = s * 2;while (l <= t){if (l < t&&T[l] < T[l + 1])l += 1;if (tmp > T[l])break;else{T[now] = T[l];now = l;l = l * 2;}}T[now] = tmp;}void heap::interts(int e)//插入堆中,减堆操作也是通过该操作完成的{if (len != cap)T[len + 1] = e;elsethrow"error:out of range!\n";up(len + 1);//插入之后的向上调整++len;}int heap::remove(int e){int ind = get_ind(e);if (ind == -1)return -1;else{T[ind] = T[len];down(ind, len - 1);//删除之后的向下调整}--len;return 0;}void heap::show(){for (int i = 1; i <= len; ++i)cout << T[i] << " ";cout << endl;}int main(){heap h(10);int a[200] = {0};int n;cin >> n;for (int i = 1; i <= n; ++i){cin >> a[i];h.interts(a[i]);}h.show();//以下为试验代码h.interts(85);h.show();h.interts(90);h.show();h.remove(100);h.show();return 0;}
在网上看了些代码,学着写了写