首先:將陣列看成樹,由於大根堆輸出的元素是由小到大的,每次調整堆,都將根元素(即最大的元素)移到葉節點處
(我的理解是,大根堆只是剛開始根的最大的,一次遞迴將最大元素放到葉節點之後,根元素是最小元素,輸出類似按樹的每一層輸出)
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的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...