模版代码。。。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> using namespace std; int heap[500010],n; void shiftdown(int i,int m) // 堆向下调整 { int k,t; t=heap[i]; k=2*i; while(k<=m) { if(k<m&&heap[k]>heap[k+1]) k++; if(t>heap[k]) { heap[i]=heap[k]; i=k; k=2*i; } else break; } } void shiftup(int x) //堆向上调整 { int temp; temp=heap[x]; for(int i=x/2;i>0&&temp<heap[i];i=i/2) { heap[x]=heap[i]; x=i; } heap[x]=temp; } void del() //删除堆顶元素 { heap[1]=heap[n]; n--; if(n>0) { shiftdown(1,n); } } void insert(int x) { n++; heap[n]=x; shiftup(n); } void shiftda(int i,int len) { int t=heap[i],k=2*i; while(k<=len) { if(k<len&&(heap[k]<heap[k+1])) k++; if(t<heap[k]) { heap[i]=heap[k]; i=k; k=2*i; } else break; } heap[i]=t; } void shiftxiao(int i,int len) { int t=heap[i],k; k=2*i; while(k<=len) { if(k<len&&heap[k]>heap[k+1]) k++; if(t>heap[k]) { heap[i]=heap[k]; i=k; k=2*i; } else break; } heap[i]=t; } int main() { int t; cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&heap[i]); } for(int i=n/2;i>=1;i--) shiftxiao(i,n); //建堆 for(int j=n;j>=2;j--) // 排序 { t=heap[1]; heap[1]=heap[j]; heap[j]=t; shiftxiao(1,j-1); } for(int i=n;i>=1;i--) printf("%d ",heap[i]); return 0; }
一点也不会MMD....
恶补知识1 http://www.cppblog.com/guogangj/archive/2009/10/29/99729.html
恶补知识2 http://www.cnblogs.com/QG-whz/p/5173112.html
原文:http://www.cnblogs.com/ruojisun/p/6238860.html