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