1、思想
堆即是一棵完全二叉樹。堆排序的核心是堆調整演算法。首先根據初始輸入資料,利用堆調整演算法shiftdown()形成最大堆;然後,將堆頂元素與堆尾元素交換,縮小堆的範圍並重新調整為最大堆,如此往復。堆排序是一種不穩定的排序演算法。
2、堆調整過程(將初始堆調整為最大堆)
最大堆定義:每個節點的值都大於或等於其左右孩子節點的值。
(1)對於初始堆,如下:
(2)此時我們從最後乙個非葉子節點開始(葉節點自然不用調整,第乙個非葉子節點的索引計算方法為arr.length/2-1=5/2-1,索引從0開始,即根節點的索引值為0),從右至左,從下至上進行調整。本圖中最後乙個非葉子節點是節點6。
應為【5,6,9】三個元素中,9元素最大,所以將6與9交換。
(3)找到第二個非葉節點4,由於【4,9,8】中9元素最大,4和9交換。
這時,交換導致了子根【4,5,6】的結構混亂,繼續調整,【4,5,6】中6最大,交換4和6。
此時,我們就將乙個初始堆調整為乙個大頂堆。
3、**
/**
* title: 堆排序(選擇排序),公升序排序(最大堆),依賴於初始序列
* description: 現將給定序列調整為最大堆,然後每次將堆頂元素與堆尾元素交換並縮小堆的範圍,直到將堆縮小至1
* 時間複雜度:o(nlgn)
* 空間複雜度:o(1)
* 穩 定 性:不穩定
* 內部排序(在排序過程中資料元素完全在記憶體)
* @author rico
* @created 2023年5月25日 上午9:48:06
*/
public class heapsort
// 經過一輪堆調整後,將大根堆的根元素與堆的最後乙個元素交換
for (int i = target.length-1; i > 0; i--)
return target;
}return target;
}/**
* @description 自上而下調整為最大堆,將需要調整的元素放在合適的位置
* @author rico
* @created 2023年5月25日 上午9:45:40
* @param target
* @param start
* @param end
*/private static void shiftdown(int target, int start, int end)
if (target[j] <= temp) else
}target[i] = temp;}}
堆排序(公升序排序)
1將陣列初始化為大根堆 2從i length 1 length是陣列長度 開始迴圈直到i 0將a 0 和陣列的最後乙個元素數值交換,使陣列最後乙個元素成為最大值,次大,第三大.依次類推 3在步驟2每次第乙個元素和最後乙個元素交換值的時候,會破壞堆的結構,所以還要加多調整堆結構這一步驟。調整堆 voi...
堆排序(公升序,降序,迭代,遞迴寫法)
是一種選擇排序。平均時間複雜度為0 nlogn 是不穩定排序 大頂堆 完全二叉樹,每個節點的值都大於或等於其左右子節點的值。左右子節點的值不作要求 小頂堆 完全二叉樹,每個節點的值都小於或等於其左右子節點的值 將待排序序列構造層乙個大頂堆 左節點2n 1 右節點2n 2 父節點 i 1 2 序列的最...
希爾排序(公升序)
一 思想 設待排序元素共有n個元素,首先取乙個整數gap二 title 插入排序中的希爾排序,依賴於初始序列 description 分別對間隔為gap的gap個子序列進行直接插入排序,不斷縮小gap,直至為 1 剛開始時,gap較大,每個子串行元素較少,排序速度較快 待到排序後期,gap變小,每個...