Heap
来源:互联网 发布:美团收银软件 编辑:程序博客网 时间:2024/05/16 11:54
heap,堆是一种完全二叉树,所以可以选择array来存储所有节点。实现heap仅需要一个array和一组heap算法(用来插入、删除元素,取极值,将某一整组数据排列成一个heap),根据元素排列方式,分为大根堆和小根堆。
heap中所有元素都遵循特别的排列规则,所以heap不提供遍历功能,也不提供迭代器。
heap算法:C++代码实现,非STL源码。
//heap算法,底层用vector实现#include<iostream>#include<vector>#include<iterator>using namespace std;vector<int> vec;int max(vector<int>& vec,int i){ int tmp=i-1; if(vec[tmp]<vec[2*i-1]) tmp=2*i-1; if(vec[tmp]<vec[2*i]) tmp=2*i; return tmp;}void swap(int& num1,int& num2){ int tmp=num1; num1=num2; num2=tmp;}//初始化vector数据void initVector(){ for(int i=0;i<10;i++) vec.push_back(i);}//对当前节点所在的只有三个节点存在的树进行排序void sort_heap(vector<int>& vec,int k,int len){ int tmp=k; int i=2*k+1; while(i<len) { if(i*2+1<len) sort_heap(vec,i,len); if(i*2+2<len) sort_heap(vec,i+1,len); if(vec[i]<vec[i+1]) i++; if(vec[tmp]>vec[i]) break; tmp=i; i=i*2+1; } if(k!=tmp) swap(vec[tmp],vec[k]); return;}//构建大根堆void make_heap(vector<int>& vec,int len){ for(int i=0;i<len;i++) sort_heap(vec,i,len);}//输出heapvoid show_heap(vector<int>& vec){ vector<int>::iterator first=vec.begin(); vector<int>::iterator last=vec.end(); while(first!=last) { cout<<*first<<" "; ++first; } cout<<endl;}//插入新元素后向上调整void push_heap(int k){ int tmp=vec[k]; int i=(k+1)/2-1; while(i>=0) { if(vec[i]>=tmp) break; else { vec[k]=vec[i]; k=i; i=(k+1)/2-1; } } vec[k]=tmp;}//删除堆顶元素并向下调整void pop_heap(vector<int>& vec,int len){ swap(vec[0],vec[len-1]); show_heap(vec); make_heap(vec,len-2); vec.pop_back();}int main(){ initVector(); int len=vec.size(); //构建大根堆 make_heap(vec,len); show_heap(vec); //插入新元素 vec.push_back(len++); push_heap(len-1); show_heap(vec); //删除堆顶元素 pop_heap(vec,len); show_heap(vec); return 0;}
0 0
- Heap
- Heap
- heap
- Heap
- heap
- heap
- heap
- Heap
- heap
- Heap
- heap
- heap
- heap
- heap
- Heap
- heap
- JVM: Heap & Non-Heap
- Shallow heap & Retained heap
- Java Web的项目目录结构
- 很少人知道的Linux命令
- Ubuntu12与开发板连接网络,IP地址设置
- matlab散点的三角剖分和散点插值
- 【C】将m~n之间的素数输出与VS2005以上版本对C语言的scanf的警告warning C4996
- Heap
- iOS日常需求:注册页面的倒计时按钮
- jdk的动态代理源码解析
- 北大ACM试题分类 - 实时更新我所有的解题报告链接
- tomcat websocket连接
- appium-5 技巧
- Mongodb 3.0.5 安装配置档超级初级1
- JDBC连接MySQL【各参数详解】
- js this指向问题