堆排序
代码实现:
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;
}
}
}
}