public class HeapSort { public static void main(String[] args) { //要求将数组进行升序排序 int[] arr = {4, 6, 8, 5, 9,-1}; heapSort(arr); System.out.println(Arrays.toString(arr)); } /** * 编写一个堆排序的方法 * * @param arr */ public static void heapSort(int[] arr) { int temp = 0; System.out.println("堆排序!"); // 将无需数组构建成一个堆{9,6,8,5,4} for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } // 将堆顶元素与末尾元素进行交换,将最大元素下沉到数组末端 // 重新调整结构,继续交换 for (int j = arr.length - 1; j > 0; j--) { // 交换 temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); } } /** * 将一个数组(二叉树),调整为一个大顶堆 * 功能:完成将以i对应的非叶子节点的树调整成大顶堆 * * @param arr 待调整数组 * @param i 非叶子节点的索引 * @param length 对多少个元素进行调整,length在逐渐减小 */ public static void adjustHeap(int[] arr, int i, int length) { //现货区当前元素的值,保存在临时变量 int temp = arr[i]; // k=i*2+1 k是i的左子节点 for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { // 左子节点小于右子节点 if (k + 1 < length && arr[k] < arr[k + 1]) { //k指向右子节点 k++; } // 如果子节点大于父节点 if (arr[k] > temp) { //将较大的值赋给当前节点 arr[i] = arr[k]; //i指向k继续循环比较 i = k; } else { break; } } // 当for循环结束后,已经将i为父节点的树的最大值,放到了最顶部(局部) // 将temp值放到调整后的位置 arr[i] = temp; } }