堆排序(公升序)

2021-08-20 22:44:37 字數 1631 閱讀 4632

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變小,每個...