/**
* 堆排序(大頂堆)
* 將記錄看成乙個順序儲存的二叉樹
* 先構建大頂堆,所有節點都比他的兒子大或者等於。
* 第一步:從最後乙個非葉子節點開始比較,一直到根。
* 構建大頂堆成功。
* 第二步:根與最後的葉子節點交換位置
* 第三步:除去剛才的葉子節點,再次構建大頂堆,
* 這個時候構建大頂堆只要從上往下層級遍歷就好。
** 演算法效能:
* 堆排序,他的執行時間主要實在堆的構建和重建堆的反覆篩選上
* 在構建堆的時候:我們從完全二叉樹的最後乙個非葉子節點開始構建
* 將他與他的孩子節點進行比較,交換。對於每乙個非葉子節點來說。
* 最多就是兩次比較和一次交換。所以初始化堆的時間複雜度是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,可以得到其父結點 左...