演算法導論之堆排序

2021-06-20 16:19:38 字數 1050 閱讀 8532

堆排序主要是先建堆,轉化為最大堆,每次把最大的乙個(即最大堆的根節點)和最後乙個交換,這樣每次都把當前最大的乙個放到了最後。

堆排序演算法中,最關鍵的就是構造初始堆。需要編寫乙個維護大頂堆性質的函式max_heapify。當輸入乙個陣列l和乙個下標i,然後呼叫max_heapify時,比較l[i]、l[left(i)]和l[right(i)]三者的大小;如果l[i]小於其孩子結點,就違背了大頂堆的性質,讓l[i]和較大的孩子結點交換,實現在大頂堆中「降級」,從而使l[i]結點遵循大頂堆的性質。但交換後,以l[i]為根的子樹又有可能違反最大堆的性質,因此對該子樹遞迴的呼叫max_heapify函式。如呼叫max_heapify(l,2)後的遞迴過程。

//每次直接改變了陣列elements

//堆就是用陣列的形式儲存的

//從零開始是左孩子是i* 2 + 1,右孩子是i* 2 + 2

//本方法是構建大頂堆(有小到大排序)

//構建後之後,每次再把最大的那個元素(也就是樹的根節點)放到最後

//每次對去除最後已經ok的那個元素進行建堆

//大頂堆是表示把大的葉子節點調換到父節點上

public class heapsort

}private static void buildheap( int elements, int lastindex)

int maxindex = leftchild

//從零開始是左孩子是i* 2 + 1,右孩子是i* 2 + 2

if (parent < elements[maxindex])}}

private static void swap( int elements, int firstindex, int secondindex)

public static void main(string args );

heapsortfunction(a);

for(int i=0;i}}

演算法導論之堆排序

二叉 堆,是乙個陣列,可以被看成乙個近似的完全二叉樹,樹上的每乙個節點對應於陣列中的乙個元素。除了最底層之外,該樹是完全充滿的,而且是從左向右填充,a.length表示陣列元素的個數,樹的根結點是a 1 這樣給定乙個節點的下標i,我們很容易計算出其父節點 i 2 左子女 2 i 右子女 2 i 1 ...

演算法導論筆記之堆排序

堆排序 時間複雜度nlgn 堆是一種特殊的二叉樹,最大堆 根節點的key大於其兩個孩子節點鍵值,依次類推,所以最大值為根,最小值在葉子節點處 ita定義堆的陣列表示法為1 10,所以a 0 暫用無處,比如,長度為10的堆,則用a 1 a 10 表示,建立時的長度要比實際長度多1 幾個常見操作 hea...

演算法導論之堆排序相關

堆排序文件 二叉堆分為兩種 最大堆 最小堆 最大堆 最大元素在根部,在堆的所有結點中,a patent i a i 最小堆 最小元素在根部,在堆的所有結點中,a patent i a i 下面以最大堆為例解釋堆排序的具體過程 首先會用到幾個基本的函式 parent i return i 2 left...