數組實現:
#include "stdafx.h" #include<iostream>using namespace std;void adjustHeap(int a[],int index,int length){ int record = a[index]; for(int j = 2*index;j<length;j*=2)// { if(a[j]<a[j+1])//找到較大的兒子 { j = j+1; } if(record>a[j])//如果record比a[j]大,那表示不需要再往下找合適的地點放置record了 { break; }//如果record比當前的a[j]小,那麼還需要繼續往下層尋找record應該放置的地點 a[index] = a[j]; index = j; } a[index] = record; }void add(int *a,int size,int val)//往堆裡插入一個元素,使其仍然保持有序{ //*(a+size) = 100; //display(a,size); int tmp = size;//tmp表示應該插入的位置 int parent = tmp/2; while(parent>0) { if(*(a+parent) > val)//如果父節點比val大,那麼表示val不可能再往上升了。 break; *(a+tmp) = *(a+parent);//如果父節點比val小,說明val還應該往上升,才能調整成為大根堆 tmp = parent; parent = tmp/2; } *(a+tmp) = val;}void display(int a[], int len){ for(int i=1;i<len;i++) cout<<a[i]<<" "; cout<<endl;}int main(){ int a[20] = {0,49,38,65,97,76,13,27,49}; int len = 9; display(a,len); for(int i=len/2;i>0;i--)//從最後一個非葉子節點開始調整 { adjustHeap(a,i,len); }add(a,len,100);len++; display(a,len); for(int i=0;i<len-1;i++)//交換樹根和最後一個葉子節點,這樣最大的數就到數組最後去了,然後在調整前面的未排序節點 { int tmp = a[1]; a[1] = a[len-1-i]; a[len-1-i] = tmp; adjustHeap(a,1,len-2-i); } display(a,len); getchar(); return 0;}