堆 分为大顶堆和小顶堆
其特点就是根节点的值一定大于或小于叶子节点的值
堆的构建方式可以从上到下 或者 从下到上
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) } } }