首页 > 编程语言 >Java 堆排序

Java 堆排序

时间:2023-09-04 11:12:20浏览次数:42  
标签:index Java int 堆排序 length rootIndex isMaxHop originArr

思路

  1. 从最后的非叶子节点开始,从后向前构建一个堆(大顶堆/小顶堆);即最后的非叶子节点和其下的叶子节点构成一个大顶堆,然后再找前面一个非叶子节点继续
  2. 此时根节点是最大的数据,然后将根节点和最后一位进行交换
  3. 交换后,排除最后一位最大值,再从根节点开始构建大顶堆
  4. 重复2,3步骤

代码

    /**
     * 堆排序
     *
     * @param originArr 需要排序的数组
     * @param isMaxHop  true:从小到大排序,false:从大到小排序
     */
    public static void heapSort(int[] originArr, boolean isMaxHop) {
        if (originArr == null || originArr.length == 0) {
            return;
        }
        // 构建堆
        createHeap(originArr, isMaxHop);
        // 循环2,3步
        for (int i = originArr.length - 1; i >= 1; i--) {
            // 交换
            exchangeElement(originArr, 0, i);
            // 重新构建
            heap(originArr, 0, i, isMaxHop);
        }
    }

    private static void createHeap(int[] originArr, boolean isMaxHop) {
        int half = originArr.length / 2;
        for (int i = half; i >= 0; i--) {
            heap(originArr, i, originArr.length, isMaxHop);
        }
    }

    private static void heap(int[] originArr, int rootIndex, int length, boolean isMax) {
        int leftLeafIndex = rootIndex * 2 + 1;
        int rightLeafIndex = rootIndex * 2 + 2;
        int index = rootIndex;
        if (leftLeafIndex < length && (isMax ? originArr[leftLeafIndex] > originArr[rootIndex] :
                originArr[leftLeafIndex] < originArr[rootIndex])) {
            index = leftLeafIndex;
        }
        if (rightLeafIndex < length && (isMax ? originArr[rightLeafIndex] > originArr[index] :
                originArr[rightLeafIndex] < originArr[index])) {
            index = rightLeafIndex;
        }
        if (rootIndex != index) {
            exchangeElement(originArr, rootIndex, index);
            heap(originArr, index, length, isMax);
        }
    }

    private static void exchangeElement(int[] array, int index1, int index2) {
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }

标签:index,Java,int,堆排序,length,rootIndex,isMaxHop,originArr
From: https://www.cnblogs.com/liu-im/p/17676404.html

相关文章

  • 20230529 java.lang.reflect.InvocationHandler
    介绍java.lang.reflect.InvocationHandlerpublicinterfaceInvocationHandlerAPIpublicinvokeinvokeDefault调用接口的default方法......
  • 20230529 java.lang.reflect.AnnotatedElement
    介绍java.lang.reflect.AnnotatedElementpublicinterfaceAnnotatedElementAPIisAnnotationPresentgetAnnotationgetAnnotationsgetAnnotationsByTypegetDeclaredAnnotationgetDeclaredAnnotationsByTypegetDeclaredAnnotations......
  • maven-resources-production:webapi: java.lang.NegativeArraySizeException
    maven-resources-production:webapi:java.lang.NegativeArraySizeException打开项目启动时,发现报这个错误,基于此,我分析了一下,首先原本好好的项目突然这样子,首先查看代码更新的情况,发现代码并没有作任何变化。分析代码jar包的问题,首先mvnclean和mvninstall直接一起上。代码可......
  • java多线程爬取笔趣阁所有小说
    可以选择下载的数量,全部下载下来够呛,首先没那么大的盘新版本:https://wws.lanzous.com/iAEMoghsgeb密码:7vjzjar包:https://wws.lanzous.com/ilphyghsgcj密码:f38a <dependency><!--jsoupHTMLparserlibrary[url=home.php?mod=space&uid=402414]@[/url]htt......
  • 全开源风车im源码(前端uniapp可发布H5及app/后端java含视频搭建教程)
    互联网彻底改变了我们的沟通方式,电子邮件是迄今为止采用最快的通信形式。不到二十年前,还没有多少人听说过它。现在,我们中的许多人都用电子邮件而不是写信,甚至打电话给别人,世界各地的人们每天发送数十亿封电子邮件。源码:ms.jstxym.top但有时甚至电子邮件也不够快。您可能不知道您......
  • GraalVM 打包 Java ShellcodeLoader 为可执行文件
    GraalVM打包JavaShellcodeLoader为可执行文件url:https://app.yinxiang.com/fx/a6667249-7c5e-40dd-8bf6-e474fc844163title:GraalVM打包JavaShellcodeLoader为可执行文件date:2023-03-0212:37:26打包成Jar包先上项目地址:https://github.com/yzddmr6/Java-Sh......
  • Failed to start bean 'documentationPluginsBootstrapper'; nested exception is jav
    2023-09-0322:53:53.622WARN20788---[main]ConfigServletWebServerApplicationContext:Exceptionencounteredduringcontextinitialization-cancellingrefreshattempt:org.springframework.context.ApplicationContextException:Failedtostartbean......
  • Java泛型
    Java泛型1.泛型概述泛型的本质是为了参数化类型(即限制参数类型为我们指定泛型类型)如这样:给list集合指定类型String//比如给List集合指定一个泛型(String),那么存入List集合中的元素必须要是String类型List<String>list=newArrayList<String>();2.泛型的优点限制变量的类......
  • 【面试题精讲】Java Stream排序的实现方式
    首发博客地址系列文章地址如何使用JavaStream进行排序在Java中,使用Stream进行排序可以通过sorted()方法来实现。sorted()方法用于对Stream中的元素进行排序操作。具体实现如下:对基本类型元素的排序:使用sorted()方法对Stream进行排序,默认是按照自然顺序进行排序。例如,对......
  • Java项目日常开发中使用BigDecimal常见问题总结
    Java项目中有计算精度要求高的场景(如金额计算)会使用BigDecimal类型来代替Double、Float。本文整理了一些日常开发中使用BigDecimal值得注意的问题和代码实例。BigDecimal初始化时入参应使用String类型例1:BigDecimalx=newBigDecimal(3.33);BigDecimaly=newBigDecima......