自己实现一个可扩容的Heap
今天在公司看stl源码分析,感觉有点无聊。花一个小时写了一个可扩容的Heap,虽然速度很慢,但是写出来的感觉还是很不错的。
#include <iostream> using namespace std; class Heap{ public: Heap(int t_size) { //auto_resize size = t_size; arr = (int *)malloc(sizeof(int) * (t_size) + 1); end = 0; } void resize(int t_size) { int * t_arr = (int *)malloc(sizeof(int) * (t_size) + 1); if (t_size < end) end = t_size; for (int i = 1; i <= end; ++i) { t_arr[i] = arr[i]; } free(arr); arr = t_arr; size = t_size; } void push(int num) { if (end == size) { resize(2 * size); }; end += 1; if (end == 1) { arr[end] = num; } //新元素放在完全二叉树的最低端,和父节点比较。如果新元素比父节点大,则它们交换位置。然后新元素再和新的父节点比,直到不能移动为止。 int cur = end; arr[cur] = num; while (cur != 1) { if (arr[cur] > arr[(int)(cur/2)]) { int temp = arr[cur]; arr[cur] = arr[(int)(cur/2)]; arr[(int)(cur/2)] = temp; } cur = cur/2; } } int pop() { if (end == 1) { end = 0; return arr[1]; } int res = arr[1]; int cur = 1;
//和末尾的元素交换位置,然后让这个元素往下“坠落”,重新形成一颗新的最大堆 arr[cur] = arr[end]; while (cur <= end) { if (2 * cur + 1 <= end && (arr[cur] < arr[2 * cur] || arr[cur] < arr[2 * cur + 1])) { if (arr[2 * cur] > arr[2 * cur + 1]) { int temp = arr[2 * cur]; arr[2 * cur] = arr[cur]; arr[cur] = temp; cur = 2 * cur; } else { int temp = arr[2 * cur + 1]; arr[2 * cur + 1] = arr[cur]; arr[cur] = temp; cur = 2 * cur + 1; } } else if (2 * cur <= end && arr[cur] < arr[2 * cur]) { int temp = arr[2 * cur]; arr[2 * cur] = arr[cur]; arr[cur] = temp; cur = 2 * cur; } else { break; } } end -= 1; return res; } void print() { while (end) { cout << pop() << " "; } cout << endl; } void _print() { for (int i = 1; i <= size; ++i) { cout << arr[i] << " "; } cout << endl; } private: int * arr; int size; int end; }; int main() { Heap h(10); vector<int> ivect{1, 5 ,3, 2, 6, 8, 2, 3}; for (int i = 0; i < ivect.size(); ++i) { h.push(ivect[i]); } h._print(); for (int i = 0; i < 10; ++i) { h.push(1); } h._print(); h.resize(7); h.print(); h._print(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」