堆排序思路和理解

2021-09-25 02:46:21 字數 1491 閱讀 9137

堆排序思路: 1.先把陣列中的元素依次傳入構造為大根堆

2.交換根節點(陣列第乙個元素)和末尾的葉節點(陣列最後乙個元素)

3. 調整此時交換後的亂序大根堆

4. 調整完畢後,重複2,3步驟

5. 總結: 通過每次將大根堆中的棧頂元素和末尾元素交換,達到將該棧頂元素排好序的目的,依次 迴圈。

6. 要注意的點:

6-1 注意邊界值的控制,設定區間[0, heapsize)為大根堆的範圍,以此排除最後乙個元素。

6-2 注意不要讓當前結點的(交換後的棧頂元素)左右結點越界。

6-3 公式: i表示陣列下標。i的左節點下標:2i+1。 右節點下標:2i+2。 父節點下標: (i - 1) / 2

/**

* @author cj

* @date 2019/7/8

* 完全二叉樹:除根結點外,每個結點都是從左邊開始產生 然後產生右邊

* * 陣列中構造大根堆實質上是將陣列中的元素依次加進來

* 調整當前元素在陣列中的位置,使之對應在大根堆中的位置

* * 堆排序思路:1.先把陣列中的元素依次傳入構造為大根堆

* 2.交換根節點(陣列第乙個元素)和末尾的葉節點(陣列最後乙個元素)

* 3. 調整此時交換後的亂序大根堆(a[0]到a[a.length - 2])

* 4. 調整完畢後,重複2,3步驟

* 注意:堆排序傳的heapsize是陣列最後乙個數的下標,而該數是不屬於堆的

*/public class heapsort

for (int i = 0; i < a.length; i++)

int heapsize = a.length;

swap(a, 0, --heapsize);//將大根堆的根節點和最後乙個節點交換

while(heapsize >= 1)

}//生成大根堆

public static void heapinsert(int a, int index)

}/**

* 傳入乙個大根堆a,該大根堆中的某個節點被替換了,index:被替換的節點的下標

* heapify()實現的功能是將該大根堆調整為正確的大根堆

* @param a 已經被排序為大根堆的陣列a

* @param current 當前被替換的節點下標

* @param heapsize 指向堆的右邊界 [index, heapsize)區間為大根堆

*/public static void heapify(int a, int current, int heapsize) else }}

public static void swap(int a, int i, int j)

public static void main(string args) ;

heapsort(a);

for (int i = 0; i < a.length; i++)

}}

堆排序python理解 堆排序Python實現

def heap sort nos global size size len nos print the size of the list is d size build heap size,nos for i in range size 1,0,1 nums 0 nums i nums i num...

堆排序基本思路

前提 1 不建立新的空間,只在當前帶排序陣列arr中做處理 2 公升序,大頂堆。思路 1 首先建立大頂堆。建立大頂堆的過程 heapinsert 是自下而上不斷調整新加入元素的位置 2 交換首次建立好大頂堆的首尾元素 最大元素沉底,這也是為什麼利用大頂堆做公升序 同時用於重建大頂堆的arr尺寸減1 ...

堆排序演算法思路總結

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演算法...