堆排序

堆排序的构建和排序,分别构建大顶和小顶堆,然后排序
public class Jsoup {


    public static void main(String[] args) {

        int[] arr = {4, 6, 8, 5, 9,7,13};

        sortHeap(arr);
    }


    public static void sortHeap(int[] arr) {

        //先构建出大顶堆出来
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }
        System.out.println(Arrays.toString(arr));

        for (int j = arr.length - 1; j > 0; j--) {
            int temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, j);
        }
        System.out.println("堆排序后");
        System.out.println(Arrays.toString(arr));


    }

    /**
     * 构建的大顶堆
     *
     * @param arr
     * @param i
     * @param length
     */
    public static void adjustHeap(int[] arr, int i, int length) {
        //保存当前节点值
        int temp = arr[i];

        //k=2*i+1 -> k是i的左子节点
        for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {//左子节点小于又子节点
                k++;
            }
            if (arr[k] > temp) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }

        }
        //for循环结束后,形成以i为父节点的树的最大值放在顶端(局部树的根节点)
        arr[i] = temp;


    }

    /**
     * 构建的小顶堆
     *
     * @param arr
     * @param i
     * @param length
     */
    public static void adjustMinHeap(int[] arr, int i, int length) {
        //保存当前节点值
        int temp = arr[i];

        //k=2*i+1 -> k是i的左子节点
        for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {
            if (k + 1 < length && arr[k] > arr[k + 1]) {//左子节点小于又子节点
                k++;
            }
            if (arr[k] < temp) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }

        }
        //for循环结束后,形成以i为父节点的树的最大值放在顶端(局部树的根节点)
        arr[i] = temp;

    }


}

你可能感兴趣的:(后端,leetcode)