堆排序(最大堆高階) 演算法導論

2021-08-27 16:36:47 字數 1407 閱讀 1940

上篇

【堆排序(最大堆)】

說過,**是按照書中的偽碼寫出,書中的根結點是1,但一般我們陣列的下標由0開始,故而現在改為由0開始;

上篇已說過實現的過程,故而不再贅述,細節可見

上篇

將其中的一些條件改變即可:

首先是建堆的值,由0開始的根結點,對於a[n],它的父節點是(n - 1) / 2,並且到0為止,都是父節點;

故而建堆:

for (int i = (length - 1) / 2; i >= 0; i--)

另外在節點的兩個孩子則為:

int left = i * 2 + 1;  //節點i的左孩子

int right = left + 1; //節點i的右孩子節點

在進行堆排時,因為a[0]是第乙個元素,故而:

for(int i = length; i >= 1;)  //最後乙個肯定是最小的

好的,貼出**:

#include #include using namespace std;

void maxheapify(int a, int length, int i) //維護

if (right <= length && a[largest] < a[right]) //右孩子最大

if (i != largest) //最大值不是父節點

}void buildmaxheap(int a, int length) //建堆

}void heapsort(int a, int length) //堆排

歡迎交流,o(∩_∩)o

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...

最大堆排序

其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...

演算法導論 最大堆

堆資料結構市一中陣列物件,它可以被視為一棵完全二叉樹。其中最大堆或者最小堆在堆排序以及求top n型別的問題中都有著廣泛的應用。對與堆中的節點i來說,它的父節點是索引i 2,左孩子的索引是2 i,右孩子的索引是2 i 1。max heapify函式的第乙個引數是整個堆所在的陣列,第二個引數是當前節點...