堆的實現
阿新 • • 發佈:2017-08-18
堆的實現 data- con 取出 post urn 父親節 自己 priority
int heap[maxn], sz = 0; void push(int x) { int i = sz++; //自己節點的編號 while (i > 0){ int p = (i - 1) / 2; //父親節點的編號 if (heap[p] <= x) //假設已經沒有大小顛倒則退出 break; heap[i] = heap[p]; //把父親節點的數值放下來,而把自己提上去 i = p; } heap[i] = x; } int pop() { int ret = heap[0]; //最小值 int x = heap[--sz]; //要提到根的數值 //從下開始交換 int i = 0; while (i * 2 + 1 < sz){ //比較兒子的值 int a = i * 2 + 1, b = i * 2 + 2; if (b < sz && heap[a] < heap[b]) a = b; if (heap[a] >= x) //假設已經沒有大小顛倒則退出 break; heap[i] = heap[a]; //把兒子的數值提上來 i = a; } heap[i] = x; return ret; } 實際上,大部分情況下並不須要自己實現堆。比如在C++中,STL裏的priority_queue就是當中之中的一個。只是須要註意的是, priority_queue取出數值時得到的是最大值。 #include <queue> #include <cstdio> using namespace std; int main() { priority_queue<int> pque; //聲明 pque.push(3); //插入元素 pque.push(5); pque.push(1); while (!pque.empty()){ //不斷循環直到空為止 printf("%d\n", pque.top()); //獲取並刪除最大值 pque.pop(); } return 0; }
堆的實現