前几天写了一个堆的综合操作 #include <iostream.h>#include <string.h>#define DefaultSize 12class MinHeap //最小堆的类...{private: int *heap; int CurrentSize; int MaxHeapSize;public: MinHeap(int maxSize) ...{ MaxHeapSize = DefaultSize < maxSize ? maxSize : DefaultSize; heap = new int[MaxHeapSize]; CurrentSize = 0; } MinHeap(int array[], int n) ...{ MaxHeapSize = DefaultSize < n ? n : DefaultSize; heap = new int[MaxHeapSize]; memcpy(heap, array, n*sizeof(int)); CurrentSize = n; int CurrentPos = (CurrentSize - 2) / 2; //当前位置指针指向最后一个有分支节点的子树 while(CurrentPos >= 0) //如果当前位置指针大于0 ...{ FilterDown(CurrentPos, CurrentSize - 1); //依次将各子树调整为最小堆 CurrentPos--; //当前指针自减 } } void FilterDown(const int start, const int EndOfHeap) ...{ int i = start; int j = 2 * i + 1; //先让j指向i的左子女 int temp = heap[i]; //将i指向的节点缓存 while(j <= EndOfHeap) ...{ if(j < EndOfHeap && heap[j] > heap[j+1]) j++; //令j指向i的左右子女当中最小的一个 if(temp <= heap[j]) //如果缓存节点比j指向的节点小的话 break; else //如果缓存节点大于j指向的节点的话 ...{ heap[i] = heap[j]; //j指向的节点的值付给i指向的节点 i = j; //令i指向刚才j的位置 j = j * 2 + 1; //j指向j的左子女 } } heap[i] = temp; //缓存节点付给i指向的节点 } bool Insert(const int &x) //插入元素 ...{ if(CurrentSize == MaxHeapSize) ...{ cerr<<"堆满! " <<endl; return false; } heap[CurrentSize] = x; //先把插入的元素放在堆的最后一个叶子节点的位置 FilterUp(CurrentSize); //向上调整 CurrentSize++; return true; } void FilterUp(int start) ...{ int j = start; int i = (j - 1) / 2; //i指向j的双亲节点 int temp = heap[j]; //暂存heap[j]的值 while(j > 0) ...{ if(temp >= heap[i]) //如果暂存大于它的双亲节点的话,跳出循环 break; else ...{ heap[j] = heap[i]; //双亲节点付给heap[j] j = i; //j指向刚才的双亲 i = (i - 1) / 2; } } heap[j] = temp; } void PrintHeap() ...{ int *p = heap; for(int i = 0; i < CurrentSize; i++) ...{ cout<<*p<<" "; p++; } cout<<endl; } int RemoveHeap() ...{ int x = heap[0]; heap[0] = heap[CurrentSize - 1]; //最后一个叶子节点将填补根节点 CurrentSize--; FilterDown(0, CurrentSize - 1); //调整为最小堆 return x; } virtual ~ MinHeap() ...{ delete []heap; }};void main()...{ int a[] = ...{53, 17, 78, 9, 45, 65, 87, 23}; int n = sizeof(a)/sizeof(a[0]); MinHeap myHeap(a, n); cout<<"建立的最小堆为:"<<endl; myHeap.PrintHeap(); cout<<"插入元素后的最小堆为: "<<endl; myHeap.Insert(11); myHeap.PrintHeap(); cout<<"堆顶元素为:"<<endl; int x = myHeap.RemoveHeap(); cout<<x<<endl; myHeap.PrintHeap();}