题目描述
动图描述
c++版
jz关联:
40】-Heap-最小的k个数
41】-Heap-数据流中的中位数
实现
void heapSort(int[] arr) {
int heapLen = arr.length;
// 创建堆
// 从第一个非叶子节点,从下至上,从右向左调整
for (int i = arr.length / 2; i >= 0; i--) {
adjust(arr, i, arr.length);
}
// 把最大值从堆顶一个一个取下来放在末尾
for (int i = arr.length - 1; i > 0; i--) { //进行n-1趟排序
// 将当前最大的放置到数组末尾
swap(arr, 0, i);
// 将未完成排序的部分继续进行堆排序
adjust(arr, 0, i); // 对i前的节点再进行排序
}
}
void adjust(int[] arr, int i, int len) {
int left = 2 * i + 1;
int right = 2 * i + 2;
int max = i;
if (left < len && arr[left] > arr[max]) {
max = left;
}
if (right < len && arr[right] > arr[max]) {
max = right;
}
if (max != i) { //最大的不是父节点,发生了变化
swap(arr, i, max);
adjust(arr, max, len);
}
}
public void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}