堆排序

堆排序是不稳定排序

注:排升序要建大堆;排降序要建小堆。

排序原理:
直观上理解,例如想进行升序排序,就可以建立小堆,每次取堆顶元素,这样就行程了升序,但这种思路不是原地排序!!!
为了达到原地排序的效果,就需要建立一个大堆,之后每次删除堆顶元素(拿堆顶元素和堆的最后一个元素交换位置),此时最大值就到了最后的位置。
从 0 号元素进行向下调整,是前面的元素重新成为堆,再继续只想上面的操作。

在这里插入图片描述

    public static void heapSort(int[] arr) {
        creatHeap(arr);
        int heapSize = arr.length;
        for (int i = 0; i < arr.length; i++) {
            swap(arr, 0, heapSize - 1);
            heapSize--;
            shiftDown(arr, heapSize, 0);
        }
    }

    public static void creatHeap(int[] arr) {
        for (int i = (arr.length - 1 - 1) / 2; i >= 0; i--) {
            shiftDown(arr, arr.length, i);
        }
    }

    public static void shiftDown(int[] arr, int size, int index) {
        int parent = index;
        int child = 2*parent + 1;
        while (child < size) {
            if (child + 1 < size && arr[child + 1] > arr[child]) {
                child = child + 1;
             }
            if (arr[parent] < arr[child]) {
                swap(arr, parent, child);
            }
            parent = child;
            child = 2*parent + 1;
        }
    }
    
    public static void swap(int[] arr, int x, int y) {
        int tmp = arr[x];
        arr[x] = arr[y];
        arr[y] = tmp;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值