借鉴:借鉴跳转,上面都有详细的描述以及动图的实现。
堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
//堆排序
public class HeapSort {
//子节点:2*i+1 和 2*i+2
public static void heapAdjust(int[] arr, int length, int i) {
int temp = arr[i], index = 2 * i + 1;
while (index < length) {
if (index + 1 < length && arr[index] < arr[index + 1]) {
index += 1;
}
//父节点大于子节点不用进行判断
if (arr[index] <= temp) break;
arr[i] = arr[index];
i = index;
index = 2 * i + 1;
}
arr[i] = temp;
}
public static void heapSort(int[] arr) {
//构造初始堆
// 从第一个非叶子节点开始调整,左右叶子节点较大的交换到父节点上。
for (int i = arr.length / 2 - 1; i >= 0; i--) {
heapAdjust(arr, arr.length, i);
}
//排序,将最大的节点放在堆尾,然后从根节点重新调节
for (int i = arr.length - 1; i >= 1; i--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr, i, 0);
}
}
public static void main(String[] args) {
int[] arr = {0, 6, 5, 3, 7, 1, 3, 4, 2, 9};
heapSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}