注意:堆排序只能选择最大的放到最后面,不能选择最小的放到最前面
private static void biggestHeapify(int[] array, int size, int index) {
int max = 2 * index + 1;
while (max < size) {
if (max + 1 < size && array[max+1] > array[max]) {
max += 1;
}
if (array[index] >= array[max]) {
break;
}
int t = array[max];
array[max] = array[index];
array[index] = t;
index = max;
max = 2 * index + 1;
}
}
// O(n * log(n))
private static void heapSort(int[] array) {
// 建大堆
for (int i = (array.length - 2) / 2; i >= 0; i--) {
biggestHeapify(array, array.length, i);
}
for (int j = 0; j < array.length; j++) {
// 无序区间 [0, array.length - j)
// 有序区间 [array.length - j, array.length)
// 交换最大的数到无序部分的最后位置
int t = array[0];
array[0] = array[array.length - j - 1];
array[array.length - j - 1] = t;
// 无序部分,除了 [0] ,都满足堆的性质
biggestHeapify(array, array.length - j - 1,0);
}
}