演算法之堆排序(最大堆c 實現)

2021-08-13 20:04:06 字數 1552 閱讀 1412

堆是完全二叉樹的結構,因此對於乙個有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.

偽**及**如下:

通過上面觀察可知,最大堆的排序過程其實是和最大堆的刪除操作類似,由於最大堆的刪除只能在根結點進行,當將根結點刪除完成之後,就是將剩下的結點進行整理讓其符合最大堆的標準。

**實現如下:

#includeusing 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...