堆排序

public class HeapSort {
    public static void main(String[] args) {
        int a[] = { 3, 5, 1, 4, 7, 8 };
        sort(a);
        System.out.println(Arrays.toString(a));
    }

    private static void sort(int[] a) {
        // 初始化堆,从第一个非叶子结点开始
        for (int i = a.length / 2 - 1; i >= 0; i--) {
            justHeap(a, i, a.length);
        }
        // 交換收尾元素 + 调整堆
        for (int i = 0; i < a.length; i++) {
            int temp = a[0];
            a[0] = a[a.length - i - 1];
            a[a.length - i - 1] = temp;
            justHeap(a, 0, a.length - i - 1);
        }
    }

    private static void justHeap(int[] a, int i, int length) {
        int temp = a[i];
        for (int k = 2 * i + 1; k < length; k = 2 * i + 1) {
            if (k + 1 < length && a[k] < a[k + 1]) // 当前结点的左孩子 小于右孩子,k指向右孩子
                k++;
            if (a[k] > temp) {
                a[i] = a[k];
                i = k;
            } else
                break;
        }
        a[i] = temp;
    }
}
原文地址:https://www.cnblogs.com/hansc-blog/p/9351875.html