1.交换
private static void swap(int[] arr, int index1, int index2) {
int tmp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = tmp;
}
2.堆化
private static void adjust(int[] arr, int index, int length) {
// 暂存当前需要调整的结点
int tmp = arr[index];
//index*2+1的位置是index在堆对应位置的左儿子
for (int i = index * 2 + 1; i < length; i = i * 2 + 1) {
//看看左儿子和右儿子相比,选出最大的儿子,不然选了个小值儿子,无法形成堆的效果
if (i + 1 < length && arr[i] < arr[i + 1]) i++;
//大儿子,是不是比当前节点大,是的话,大儿子来领衔,当前节点继续向下找找位置,
//且把index标记到大儿子原先的位置,继续看有没有比较大的儿孙能填坑
//直到两儿子都比爹小。就行了
if (tmp < arr[i]) {
arr[index] = arr[i];
index = i;
} else {
break;
}
}
arr[index] = tmp;
}
3.堆排序
private static void heapSort(int[] arr) {
// 1.从第一个非叶子节点开始堆化,结果就是形成一个大顶堆
for (int i = arr.length/2 - 1; i >= 0; i--) {
adjust(arr, i, arr.length);
}
// 2.依次把每个节点和堆顶交换,然后对堆进行调整,最终达到排序的目的
for (int i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i);
adjust(arr, 0, i);
}
}