堆資料結構市一中陣列物件,它可以被視為一棵完全二叉樹。其中最大堆或者最小堆在堆排序以及求top n型別的問題中都有著廣泛的應用。
對與堆中的節點i來說,它的父節點是索引i/2,左孩子的索引是2*i,右孩子的索引是2*i+1。
max_heapify函式的第乙個引數是整個堆所在的陣列,第二個引數是當前節點的索引i,也可以看成對 以當前節點i為根節點的堆進行最大堆化,該過程首先是從(當前節點i,左孩子2*i,右孩子2*i+1)中找出其中對大的那個元素的索引largest,如果這個索引不是當前節點,那麼就需要交換當前節點和最大值節點的內容,交換資料內容之後,以索引largest為根節點的堆可能不是最大堆,所以需要緊接著重新繼續呼叫max_heapify。
build_max_heap則是以一種自底向上的方式建立最大堆,之所以使用這種方式,私以為,是因為為了更好的利用max_heapify,減少max_heapify的呼叫次數。
其中需要注意的是,這裡的陣列中的index需要1開始,陣列中的第乙個(0)元素-1是為了占用乙個位置。
#include #include using namespace std;
#define parent(i) (i/2)
#define left(i) (2*i)
#define right(i) (2*i+1)
void max_heapify(vector&a,int i)
if (ra[largest])
if (largest!=i) // if current parent is not the largest one , then }
void build_max_heap(vector&a)
}
//
void test_max_heap()
; vectora(a,a+11);
vector::iterator iter ;
for ( iter=a.begin()+1; iter!=a.end(); iter++)
cout<
堆排序(最大堆高階) 演算法導論
上篇 堆排序 最大堆 說過,是按照書中的偽碼寫出,書中的根結點是1,但一般我們陣列的下標由0開始,故而現在改為由0開始 上篇已說過實現的過程,故而不再贅述,細節可見 上篇 將其中的一些條件改變即可 首先是建堆的值,由0開始的根結點,對於a n 它的父節點是 n 1 2,並且到0為止,都是父節點 故而...
最大堆排序java實現(演算法導論第6章)
主程式 package yangkunlin.algorithm.sort import yangkunlin.algorithm.tool.sorttool 堆排序 前提 堆的根節點的序號是1,並且滿足最大堆屬性。堆是存放在陣列中的,堆的大小要小於陣列的大小。注意下邊個方法的引數是以1開始記得。時...
c 最大堆的演算法實現
堆的資料結構是一種陣列,也可以說堆是一種有個性的陣列,他可以被視為一顆完全二叉樹 也有可能是滿二叉樹 任一節點的值均大於等於他左右孩子節點的值,其中堆頂的值最大 根節點 左孩子節點 2 父節點 1 右孩子節點 2 父節點 2 父節點 孩子節點 1 2 堆的應用場景 從很多個數中找出最大的前k個數 最...