堆排序(升序)

最大堆是父节点元素大于该父节点的左右儿子元素,具有这样性质的二叉树。将序列构建成一个最大堆,则根节点(第一个元素序列)即为最大元素,最大元素与最后一个序列元素交换,则最大元素已放到最后,则可将序列长度减一,前n-1个元素再进行构建最大堆,交换元素;如此反复,直到剩余最后一个元素,即已排好顺序。 构建最大堆时,设序列为nums[],则所构成二叉树的第一个叶节点序号是n.length()/2;节点i的左儿子节点是2*i + 1,右儿子节点是2*i+2。所有在构...
摘要由CSDN通过智能技术生成

       最大堆是父节点元素大于该父节点的左右儿子元素,具有这样性质的二叉树。

        将序列构建成一个最大堆,则根节点(第一个元素序列)即为最大元素,最大元素与最后一个序列元素交换,则最大元素已放到最后,则可将序列长度减一,前n-1个元素再进行构建最大堆,交换元素;如此反复,直到剩余最后一个元素,即已排好顺序。

        构建最大堆时,设序列为nums[],则所构成二叉树的第一个叶节点序号是n.length()/2;节点i的左儿子节点是2*i + 1,右儿子节点是2*i+2。所有在构造最大堆时,要检查父节点元素是否大于其左右儿子,若大于则不需要比较;若不大于,则要进行交换:将父节点元素与其左右儿子节点中最大的那一个交换位置。交换后,还要继续检查交换后的儿子节点是否大于儿子节点的儿子节点......以此做个比较,直到遍历到根节点,检查根节点与其儿子节点的大小,需不需要交换;将根节点及其子树遍历完后,则根节点就是这颗二叉树中最大的节点元素了,就构成了最大堆。

public static void goJianDun(int[] nums, int end) {    //构建最大堆
        for (int i = end /2 -1; i >= 0; i--) {     //遍历所有非叶节点
            int begin = i, high = end / 2;
            while (begin < high) {    //当begin等于或大于叶子节点下标时,停止循环
                int lef = begin * 2 + 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值