java排序演算法(七)------堆排序
阿新 • • 發佈:2018-12-11
堆排序
程式碼實現:
public static void sort01(int[] arr) {
for (int i = 0; i < arr.length; i++) {
headAdust01(arr, arr.length - 1 - i);
swap(arr, 0, arr.length - 1 - i);
}
}
public static void headAdust01(int[] arr, int last) {
for (int i = (last - 1) / 2; i >= 0; i--) { // 獲得最後一個葉節點的父節點,依次遞減遍歷父節點
int parent = i;
// 判斷是否有左子節點
while (2 * parent + 1 <= last) {
int biggest = 2 * parent + 1; // biggest指向最大節點,先初始化為左子節點
if (biggest < last) { // 判斷有右節點
if (arr[biggest] < arr[biggest + 1]) {
biggest = biggest + 1;
}
}
if (arr[parent] < arr[biggest]) {
swap (arr, parent, biggest);
parent = biggest;
} else {
break;
}
}
}
}