堆是完全二叉樹的結構,因此對於乙個有n個節點的堆,高度為o(logn)。
最大堆:堆中的最大元素存放在根節點的位置。 除了根節點,其他每個節點的值最多與其父節點的值一樣大。也就是任意乙個子樹中包含的所有節點的值都不大於樹根節點的值。
堆中節點的位置編號都是確定的,根節點編號為1,每一層從左到右依次編號。由堆是完全二叉樹,可以知道當堆中某個節點的編號為i時,如果這個節點有左右子樹,那麼左子樹的節點編號為2*i,右子樹的節點編號為2*i+1(當然這是在根節點編號為1的情況時)。
如下圖所示:
堆排序演算法:
初始時候演算法是利用buildmaxheap將陣列a[1...n]建成最大堆,因為陣列中最大元素總在根節點a[1]處,通過把他與a[n]進行互換,我們可以讓該元素放到正確位置。這時候,如果我們從堆中去掉結點n,剩餘結點仍然是最大堆,而新的結點可能會違背最大堆的性質。為了維護最大堆的性質,我們呼叫maxheap(a, 1),從而在a[1...n-1]上構造乙個新的最大堆。堆排序要做的是不斷重重複這樣的操作,直到堆的大小從n-1降到2.
偽**及**如下:
heapsort(a)
1:buildmaxheap(a)
2: for i=a.length downto 2
3: exchange a[1] with a[i]
4: maxheap(a, 1)
通過上面觀察可知,最大堆的排序過程其實是和最大堆的刪除操作類似,由於最大堆的刪除只能在根結點進行,當將根結點刪除完成之後,就是將剩下的結點進行整理讓其符合最大堆的標準。
**實現如下:
#include
using namespace std;
void heapsort(int a, int n);
void maxheap(int a, int n);
void buildmaxheap(int a, int n);
int size;
int main()
;size= sizeof(a) / 4;
heapsort(a, size);
for (int i = 0; i < 8; i++)
cout << a[i] << " ";
return 0;
}void heapsort(int a, int n)
}void buildmaxheap(int a, int n)
void maxheap(int a, int n)
}結果如下:
演算法之堆排序(最大堆c 實現)
堆是完全二叉樹的結構,因此對於乙個有n個節點的堆,高度為o logn 最大堆 堆中的最大元素存放在根節點的位置。除了根節點,其他每個節點的值最多與其父節點的值一樣大。也就是任意乙個子樹中包含的所有節點的值都不大於樹根節點的值。堆中節點的位置編號都是確定的,根節點編號為1,每一層從左到右依次編號。由堆...
最大堆實現堆排序
堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...
最大堆排序 C
堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...