堆的基本操作
侵權(quán)刪。
?原文章:https://www.cnblogs.com/JVxie/p/4859889.html
最近實(shí)現(xiàn)哈夫曼編碼時(shí)用到堆操作
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define maxn 100010 //這部分可以自己定義堆內(nèi)存多少個(gè)元素 using namespace std; struct Heap {int size,queue[maxn];Heap() //初始化 {size=0;for(int i=0;i<maxn;i++)queue[i]=0;}void shift_up(int i) //上浮 {while(i>1){if(queue[i]<queue[i>>1]){int temp=queue[i];queue[i]=queue[i>>1];queue[i>>1]=temp;}i>>=1;}}void shift_down(int i) //下沉 {while((i<<1)<=size){int next=i<<1;if(next<size && queue[next+1]<queue[next])next++;if(queue[i]>queue[next]){int temp=queue[i];queue[i]=queue[next];queue[next]=temp;i=next;}else return ;}}void push(int x) //加入元素 {queue[++size]=x;shift_up(size);}void pop() //彈出操作 {int temp=queue[1];queue[1]=queue[size];queue[size]=temp;size--;shift_down(1);}int top(){return queue[1];}bool empty(){return size;} void heap_sort() //另一種堆排方式,由于難以證明其正確性 { //我就沒有在博客里介紹了,可以自己測試 int m=size; for(int i=1;i<=size;i++){int temp=queue[m];queue[m]=queue[i];queue[i]=temp;m--;shift_down(i);}} }; int main() {Heap Q;int n,a,i,j,k;cin>>n;for(i=1;i<=n;i++){cin>>a;Q.push(a); //放入堆內(nèi) }for(i=1;i<=n;i++){cout<<Q.top()<<" "; //輸出堆頂元素 Q.pop(); //彈出堆頂元素 }return 0; }HEAP CODE?
總結(jié)
- 上一篇: 如何查看MySQL的当前存储引擎?
- 下一篇: 堆操作,版本二