编辑代码

public class HeapSort {

    public static void heapSort(int[] arr) {
        int n = arr.length;

        // 构建最大堆
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // 依次取出堆顶元素,并执行堆化操作
        for (int i = n - 1; i >= 0; i--) {
            // 将堆顶元素与堆末尾元素交换
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // 执行堆化操作
            heapify(arr, i, 0);
        }
    }

    private static void heapify(int[] arr, int n, int i) {
        int largest = i;  // 初始化最大元素索引
        int left = 2 * i + 1;  // 左子节点索引
        int right = 2 * i + 2;  // 右子节点索引

        // 若左子节点大于根节点,则更新最大元素索引
        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }

        // 若右子节点大于根节点,则更新最大元素索引
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }

        // 若最大元素不是根节点,则交换最大元素和根节点,并递归调整被交换的子树
        if (largest != i) {
            int temp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = temp;
            heapify(arr, n, largest);
        }
    }

    public static void main(String[] args) {
        int[] arr = {6,23,12,56,89,35,26};

        heapSort(arr);

        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}