堆排序Java实现以及使用场景

堆排序是一种基于大小堆的排序算法,通过构建最大树或最小树,逐步下沉最大或最小元素实现排序。虽然其平均时间复杂度为O(nLogn),但因交换次数较多,效率不及快速排序。然而,当需要找到最大或最小部分元素时,堆排序表现出优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序是基于大小堆来实现的,利用数组中左右子树的数学规律来进行构建最大树或者是最小树,在这基础上将最大数或者是最小树下沉,并将树的长度减1,直到树的长度为1,最后数组即为排序后的数组

场景:跟快排一样是一个O(nLogn)的算法,但是在堆排序中有较多次数的交换,所以总体来说,是比不上快排的,但是如果你需要的不是整个排序,而是最大或者是最小的一部分,那么堆排序就具有很大优势了

实现:

private static void heapSort(int[] arrays){
        buildMaxHeap(arrays,arrays.length);
        for(int i = arrays.length;i>1 ;i--){
            swap(arrays,0,i-1);
            adjustHeap(arrays,0,i-1);
        }
    }

     /**
     * 构建最大树
     * */
    private static void buildMaxHeap(int[] arrays ,int length){
        for(int i = (length>>1)-1;i>=0 ;i--){
            adjustHeap(arrays,i ,length);
        }
    }

    /***
     * 对数据的第i个节点进行比较,将左右子节点的最大值放到i节点,
     * 如果发生交换,则需要对子节点的子树进行比较
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值