對大根堆的理解

2021-10-03 21:10:45 字數 1241 閱讀 7026

首先:將陣列看成樹,由於大根堆輸出的元素是由小到大的,每次調整堆,都將根元素(即最大的元素)移到葉節點處

(我的理解是,大根堆只是剛開始根的最大的,一次遞迴將最大元素放到葉節點之後,根元素是最小元素,輸出類似按樹的每一層輸出)

eg:結果如下所示             初始---------------------------------->初建堆(大根堆)--------------------------------->結果

例如:最大的元素與最後乙個葉節點互換,第二大的元素與倒數第二個葉節點互換。。。。以此類推

最大的元素與最後乙個葉節點互換之後,進行一次由上到下的堆排序,將第二大的元素提到根結點中。。。。以此類推

步驟:1、初建堆:由下到上構造大根堆,確保每個結點都大於其左、右結點

2、調整堆:將樹中最後乙個元素與根結點互換,再由上到下構造新的大根堆

將樹中倒數第二個元素與根結點互換,由上到下構造新的大根堆。。。以此類推

3、輸出陣列即為單調遞增的陣列

參考文章:

#include#include#include#include#includeusing namespace std;

// 遞迴方式構建大根堆(len是arr的長度,index是第乙個非葉子節點的下標)

void adjust(vector&arr, int len, int index)

}// 堆排序

void heapsort(vector&arr, int size)

// 調整大根堆

for (int i = size - 1; i >= 1; i--) }

int main()

; heapsort(arr, arr.size());

for (int i = 0; i < arr.size(); i++)

system("pause");

return 0;

}

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...