public static <T extends Comparable<? super T>> void heapSort(T[] arr){ //build heap for(int i = arr.length/2 - 1; i >= 0; i--) percDown(arr, i, arr.length);
for(int i = arr.length - 1; i >= 0; i--) { swapReference(arr, 0, i);//delete Max
percDown(arr, 0, i);// 从根开始向下堆调整 } }
private static <T extends Comparable<? super T>> void swapReference(T[] arr, int from, int to){ T tmp; tmp = arr[from]; arr[from] = arr[to]; arr[to] = tmp; }
//求解 i 的左孩子 private static int leftChild(int i){ return 2*i + 1; }
/** * * @param arr 存储堆的一维数组 * @param i 从 i 位置开始进行向下堆调整 * @param n 堆中元素的个数(不是数组的长度) */ private static <T extends Comparable<? super T>> void percDown(T[] arr, int i, int n){ int child; T tmp;//保存当前待调整的结点,当找到了合适的位置后,需要将之放入到合适位置,以保持堆序性质