堆排序的实现

2019-07-30  本文已影响0人  just_like_you

使用大顶锥实现升序排序,二叉堆的详细操作见以前的文章


步骤如下:

public class HeapSortTest {

    public static void main(String[] args) {
        int[] arr = {32, 32, 12, 3, 4, 5, 12, 1, 4, 6};
        heapSort(arr, arr.length);
        System.out.println(Arrays.toString(arr));
    }


    /**
     * 下沉操作
     */

    public static void downAdjust(int[] arr, int index, int length) {
        int parent = index;
        int child = parent * 2 + 1;
        int tmp = arr[parent];
        while (child < length) {
            //获取两个中间较大的值
            if (child + 1 < length && arr[child + 1] > arr[child]) {
                child++;
            }
            if (tmp >= arr[child]) {
                break;
            }
            arr[parent] = arr[child];
            parent = child;
            child = child * 2 + 1;
        }
        arr[parent] = tmp;
    }


    /**
     * 构建大顶堆,利用非子叶节点依次下沉完成构建
     * @param arr
     */
    public static void buildMaxHeap(int[] arr) {
        for (int i = (arr.length - 2) / 2; i >= 0; i--) {
            downAdjust(arr, i, arr.length);
        }
    }

    public static void heapSort(int[] arr, int length) {
        //构建大顶堆
        buildMaxHeap(arr);
        //交换头尾元素
        for (int i = length - 1; i > 0; i--) {
            int tmp = arr[0];
            arr[0] = arr[i];
            arr[i] = tmp;
            downAdjust(arr, 0, i);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读