支持动态维护的堆排序
来源:互联网 发布:喝咖啡会难怀孕吗 知乎 编辑:程序博客网 时间:2024/05/21 06:58
#include <iostream>#include<algorithm>#include<cstdio>using namespace std;//动态的维护一个大顶堆 支持 添加数据 和删除堆顶数据 并且总保持有序状态//数组从a[1] 开始void addAdjust(int *a,int size){ int id = size; while(id/2!=0&&a[id]>a[id/2]) { swap(a[id],a[id/2]); printf("%d %d\n",a[id],a[id/2]); id = id/2; }}//删除堆顶元素void deleteAdjust(int *a,int size){ int id = 1; a[id] = 0; while(id<=size/2) { int lchild = id*2<size?id*2:0; int rchild = id*2+1<size?id*2+1:0; if(lchild*rchild) { if(a[lchild]>a[rchild]) { swap(a[lchild],a[id]); id = lchild; } else { swap(a[rchild],a[id]); id = rchild; } } else if(lchild) { swap(a[lchild],a[id]); id = lchild; break ; } else { break ; } } //一旦 跑到的位置不是最后位置 if(id!=size) { a[id] = a[size]; while(a[id]>a[id/2]) { swap(a[id],a[id/2]); id = id/2; } }}void heapAdjust(int *a,int i,int size){ int lchild = 2*i; int rchild = 2*i+1; int max = i; if(i<=size/2) { if(lchild<=size&&a[lchild]>a[max]) { max = lchild; } if(rchild<=size&&a[rchild]>a[max]) { max = rchild; } if(max!=i) { swap(a[max],a[i]); heapAdjust(a,max,size); } }}void buildHeap(int *a,int size){ for(int i= size/2;i>=1;i--) { heapAdjust(a,i,size); }}void heapSort(int *a,int size){ buildHeap(a,size); for(int i=size;i>=1;i--) { swap(a[1],a[i]); //cout<<a[1]<<" "; heapAdjust(a,1,i-1); }}int main(){ int a[100]; int size = 0; int data; char s[1]; while(scanf("%s",s)!=EOF) { if(s[0]=='a') { scanf("%d",&data); a[++size] = data; addAdjust(a,size); } if(s[0]=='d') { deleteAdjust(a,size); size--; } if(s[0]=='p') { for(int i=1;i<=size;i++) { cout<<a[i]<<" "; } cout<<endl; heapSort(a,size); for(int i=1;i<=size;i++) { cout<<a[i]<<" "; } cout<<endl; } } return 0;}