#include #include #include #include #include #include #include #include #include #include #include using namespace std; int const N = 20; void swapchar(char&x,char&y) { char z = x; x = y; y = z; } struct minheap { char item[N]; int size; }; int parnt(int n) { assert(n > 0); return (n-1)/2; } int lchld(int n) { assert(n >= 0); return 2*n+1; } int rchld(int n) { assert(n >= 0); return 2*n+2; } void initheap(minheap&h) { h.size = 0; } bool empty(minheap&h) { return h.size == 0; } void bubbleup(minheap&h,int n) { assert(n < h.size); if(n) { int p = parnt(n); if(h.item[n] < h.item[p]) { swapchar(h.item[n],h.item[p]); bubbleup(h,p); } } } void bubbledown(minheap&h,int n) { int m = lchld(n); if(m < h.size) { int rgt = rchld(n); if(rgt < h.size and h.item[rgt] < h.item[m]) m = rgt; if(h.item[m] < h.item[n]) { swapchar(h.item[m],h.item[n]); bubbledown(h,m); } } } void insrt(minheap&h,char x) { assert(h.size < N); h.item[h.size++] = x; bubbleup(h,h.size-1); } char deletemin(minheap&h) { assert(not empty(h)); char rslt = h.item[0]; h.item[0] = h.item[--h.size]; bubbledown(h,0); return rslt; } void tester1() { minheap mh; initheap(mh); assert(mh.size == 0); insrt(mh,'L'); insrt(mh,'G'); insrt(mh,'C'); insrt(mh,'R'); insrt(mh,'X'); insrt(mh,'T'); while(not empty(mh)) cout << deletemin(mh) << " "; cout << endl; } int main() { tester1(); return 1; }