整理排序演算法(五) 堆排序

2021-10-01 06:10:13 字數 1260 閱讀 4659

/**

* 堆排序(大頂堆)

* 將記錄看成乙個順序儲存的二叉樹

* 先構建大頂堆,所有節點都比他的兒子大或者等於。

* 第一步:從最後乙個非葉子節點開始比較,一直到根。

* 構建大頂堆成功。

* 第二步:根與最後的葉子節點交換位置

* 第三步:除去剛才的葉子節點,再次構建大頂堆,

* 這個時候構建大頂堆只要從上往下層級遍歷就好。

** 演算法效能:

* 堆排序,他的執行時間主要實在堆的構建和重建堆的反覆篩選上

* 在構建堆的時候:我們從完全二叉樹的最後乙個非葉子節點開始構建

* 將他與他的孩子節點進行比較,交換。對於每乙個非葉子節點來說。

* 最多就是兩次比較和一次交換。所以初始化堆的時間複雜度是o(n)

* 正式排序的時候:第i次取堆頂記錄和重建堆需要o(logi)的時間。

* (完全二叉樹每個節點到根的距離為log2i+1);並且需要去除n-1

* 次堆頂記錄。因此重建堆的時間複雜度為o(nlogn)。

* 所以總的來說,堆排序的時間複雜度為o(nlogn)

* @param arr

*/public static void duisort(int arr)

// 調整堆結構,交換堆頂元素和末尾元素的值,陣列結構,所以減一,到了根就不用比較了。所以i>0就行

for (int i = (len - 1); i > 0; i--)

}public static void comparewithleaf(int arr, int len, int root)

}if (temp < arr[index]) else

arr[k] = temp; // 找到最終根節點的位置

}}

排序方法

平均情況

最好情況

最壞情況

輔助空間

穩定性氣泡排序n2n

n21穩定選擇排序

n2n2n21

不穩定插入排序n2n

n21穩定希爾排序

n*logn~n2

n1.3n21

不穩定堆排序

n*logn

n*lognn21

不穩定歸併排序

n*logn

n*logn

n*lognn穩定

快速排序

n*logn

n*lognn21

不穩定

排序演算法整理 5 堆排序

程式參考了clrs的 演算法導論 第六章 heap sort。由於最大堆和最小堆是對稱的,下文都說最大堆。1 堆的定義 最大堆就是這樣一種樹,每個節點而言,如果它有兒子,那麼此節點比它的兒子都大。需要注意的有兩點。首先,堆幾乎是一種完全二叉樹,也可能是不完全的,下面第4部分中的圖一。其次,如果要用陣...

演算法 堆排序(堆)

使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...

演算法導論之五堆排序

堆排序的時間複雜度是,與插入排序相似,堆也具有空間原址性,即任何時候都只需要常數個額外的元素空間儲存臨時資料。1.堆簡介 1 堆是乙個陣列,表示堆的陣列a包括兩個屬性 a.length表示陣列元素的個數,a.heap size表示有多少個堆元素儲存在該陣列中。給定一結點的下標i,可以得到其父結點 左...