关于堆的知识复习
2016-03-17 18:33
381 查看
最近的作业里要求实现大根堆中删除一个元素,算法复杂度为log2 N,于是又复习了下大根堆得知识,堆是一种特殊的完全二叉树,因此这里我们直接用数组存储,a[i]是a[i+1]和a[i+2]的父亲,建堆需要用到向下堆调,删除直接将待删除元素和最后一个元素交换,对数组前n-1个元素再建堆就ok
代码如下:
代码如下:
<span style="font-family:Courier New;font-size:14px;">#include <cstdio> <span style="font-size:18px;">#include <cstring> #include <iostream> using namespace std; void buildHeap(int a[],int size); void percolateDown(int a[],int pos,int size); //向下堆调 void deleteElement(int a[],int &size,int x); //查找删除 void deleteIndex(int a[],int &size,int index);// 下标索引删除 int main() { int a[10],n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; buildHeap(a,n); for(int i=0;i<n;i++) { cout<<a[i]<<" "; } cout<<endl;//测试堆的创建 deleteIndex(a,n,2); cout<<"n="<<n<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; //测试deleteIndex(); deleteElement(a,n,5); cout<<"n="<<n<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; //测试deleteElement(); } void deleteIndex(int index); void buildHeap(int a[],int size) { for(int i=size/2-1;i>=0;i--) { percolateDown(a,i,size); } } void percolateDown(int a[],int pos,int size) { int p=pos,c=p*2+1; while(c<size) { if(c+1<size && a[c+1]>a[c]) c++; if(a[p]>a[c]) break; else { swap(a[p],a[c]); p=c; c=2*p+1; } } } void deleteIndex(int a[],int &size,int index) { swap(a[index],a[size-1]); percolateDown(a,index,size-1); size--; } void deleteElement(int a[],int &size,int x) { for(int i=0;i<size;i++) { if(a[i]==x) deleteIndex(a,size,i); } }</span></span><span style="font-size:18px;"> </span>
相关文章推荐
- double key map 的实现
- ubuntu 快捷键
- Android 版本升级涉及到的数据库数据迁移问题
- Windows下使用第三方lua库
- 第十一章 持有对象
- 安卓学习_基于TCP协议的网络通信
- UI设计师未来的4个发展方向
- Poj 2750 Potted Flower
- Lua C API 研究 —— 基础篇
- STUN/TURN/ICE协议在P2P SIP中的应用(二)
- mysql-5.6.24-winx64 在win10安装
- Java中守护线程的总结
- Rust 中项目构建管理工具 Cargo简介
- IOS控件学习之UIScrollView(1)
- rpm/yum命令记录
- app软件测试经验分享
- mongodb中的副本集搭建实践
- 果实自白书
- 从相机(相册)获取图片并剪裁的最佳实践
- USB 协议