堆排序
来源:互联网 发布:java中的collection 编辑:程序博客网 时间:2024/05/04 01:16
//数组实现#include <iostream>#include <cstring>using namespace std;const int maxnode = 20000;int size;int heap[maxnode];//这里是小根堆//建堆void Createheap(){ memset(heap,0,sizeof(heap)); size = 0; return ;}void swap(int &a,int &b){ int tmp; tmp = a; a = b; b = tmp; return ;}//堆的插入void up(int pos){ for(int i = pos; i > 0; i = (i-1)/2 ) { //调整新加的顶点的位置 if(heap[i] > heap[(i-1)/2]) //如果比根大,则break,这里是小根堆 break; else swap(heap[i],heap[(i-1)/2]); //否则,与根交换位置 }}void push(int x){ heap[size] = x; //在最右边插入节点 up(size); //调整 size++; //节点数++}//堆的删除void down(int pos){ int i,j; for( i = pos; i*2+1 < size;) { //注意是从根是0开始的,不是1啊啊啊啊啊啊 //根是i,那么左儿子是2*i+1 右儿子是2*i+2 j = i*2+1; //被删除节点的左儿子 if(j+1 < size && heap[j+1] < heap[j]) //找到左右儿子中较大的 j++; //右儿子 if(heap[i] < heap[j]) //若被删的节点比小儿子还小,那么符合小根堆 break; else swap(heap[i],heap[j]); //否则,交换 i = j; //heap[i],heap[j]交换后,被删除节点的位置要调整 }}void pop(int x){ size --; //是从0开始的 //最后一个节点给heap[0],经过调整会放在适当位置 //因为heap[size]赋给heap[0]后,在if(heap[i] < heap[j])时,肯定不成立的 heap[x] = heap[size]; down(x);}int main(){ int a; int i = 0; Createheap(); while(cin >> a) { push(a); i++; }while(i--){ pop(0); cout << heap[0]<<endl;} return 0;}