堆 分为大顶堆和小顶堆

其特点就是根节点的值一定大于或小于叶子节点的值

 

堆的构建方式可以从上到下 或者 从下到上

leftNode = parentNode * 2 + 1;

rightNode = leftNode + 1;

parentNode = (leftNode -1 ) / 2

 

堆排序其实就是在堆的基础上 每次拿掉根接单 然后格式化堆 再拿掉根 以此往复 最终 有序

public class StudyHeapSort {

    public static void main(String[] args) {

        String str = "12 10 12 2 9 5 6 2 -4 8 -5 -5 -7 -2 6 -8 1 -12";
        int [] array = ArrayUtil.stringToArray(str," ");

        ArrayUtil.printArray(array);

        heapSort(array);

        ArrayUtil.printArray(array);
    }

    private static void heapSort(int[] array) {
        MaxHeap maxHeap = new MaxHeap(array.length);
        if (array == null || array.length < 2) {
            return;
        }

        /** 数组变堆 */
        for (int i = array.length - 1; i >= 0; i--) {
            maxHeap.heapify(array, i, array.length);
        }
        int heapSize = array.length;
        ArrayUtil.swap(array, 0, --heapSize);
        /** 一直把最大值的提到后面 */
        while (heapSize > 0) { // O(N)
            maxHeap.heapify(array, 0, heapSize); // O(logN)
            ArrayUtil.swap(array, 0, --heapSize); // O(1)
        }
    }

}