演算法導論 最大堆

2021-06-20 21:23:26 字數 1037 閱讀 4015

堆資料結構市一中陣列物件,它可以被視為一棵完全二叉樹。其中最大堆或者最小堆在堆排序以及求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個數 最...