#include <iostream> #include <cstdlib> #include <ctime> using namespace std; // 小根堆 template < typename T, int N = 10 > class PriQueue { T * queue; int cnt; public: PriQueue() : queue ( NULL ), cnt(0) { queue = new T[N](); } ~PriQueue() { delete [] queue; } bool insert( T value) { if ( cnt >= N ) return false; queue[cnt++] = value; //插入到最后 int child = cnt-1; while ( child > 0 ) { int parent = (child-1)/2; if ( queue[parent] > value ) { queue[child] = queue[parent];//向上筛 child = parent; } else { break; } } queue[child] = value; return true; } bool deleteMin() { if ( cnt < 1 ) return false; cout<< queue[0] <<endl; queue[0] = queue[--cnt]; int i = 0; int tmp = queue[0]; while ( i < cnt/2 ) { int smallChild = i*2 + 1; if ( smallChild + 1 < cnt && queue[smallChild] > queue[smallChild+1] ) ++smallChild; if ( tmp > queue[smallChild] ) { queue[i] = queue[smallChild]; i = smallChild; } else break; } queue[i] = tmp; return true; } }; int main() { srand(time(NULL)); PriQueue<int> queue; while ( queue.insert(rand()%30) ); while ( queue.deleteMin() ); return 0; }