JAVA十大排序算法之堆排序详解

JAVA十大排序算法之堆排序详解

什么是堆排序

堆排序是一种经典的排序算法,在java的Collections.sort()方法中也采用了堆排序的实现方式。堆排序的基本思想是将待排序的序列视为一棵完全二叉树,每个节点的关键字都不大于(或不小于)其子节点的关键字,然后构建大(小)顶堆,最后依次取出堆顶元素并删除。

堆排序的原理

1.构建堆

堆排序首先需要将待排序的序列构建成一个堆。若是要对序列进行升序排序,则需要构建大顶堆;若是要对序列进行降序排序,则需要构建小顶堆。构建堆的过程一般采用从下往上的方式进行。

假设待构建的序列为A,该序列的长度为n,则A的最后一个非叶子节点为i=n/2-1。如果节点i的子节点存在,则节点i的左子节点为2i+1,右子节点为2i+2。从i开始循环,每次循环都是从父节点、左子节点、右子节点中找出最大值或最小值并交换位置,直到循环到根节点就结束,最终得到的堆就是大顶堆或小顶堆。

示例:

private static void buildMaxHeap(int[] arr) {  
    int n = arr.length;  
    for (int i = n/2-1; i >= 0; i--) {  
        maxHeapify(arr, n, i);  
    }  
}  

private static void maxHeapify(int[] arr, int n, int i) {  
    int left = 2 * i + 1;  
    int right = 2 * i + 2;  
    int largest = i;  
    if (left < n && arr[left] > arr[largest]) {  
        largest = left;  
    }  
    if (right < n && arr[right] > arr[largest]) {  
        largest = right;  
    }  
    if (largest != i) {  
        int temp = arr[i];  
        arr[i] = arr[largest];  
        arr[largest] = temp;  
        maxHeapify(arr, n, largest);  
    }  
}  

上面是对升序排列的堆排序的构建堆的函数实现。这里采用的是从下往上的方式,通过调用maxHeapify函数依次构建每一个堆,以最终构建好整个序列的堆。

2.取堆顶并删除

构建好一个堆之后,堆顶元素就是序列中最大的(或最小的)元素了。我们先将堆顶的元素与序列的最后一个元素交换位置,然后将序列的长度减一,这样原先的堆顶元素就被从堆中删除,并将其加入到了序列的"有序区间"中。最后,再用新的堆顶元素跟剩下的序列元素重新构建堆,重复以上步骤,直到所有元素都被从堆中删除并加入到序列的有序区间中。这就是堆排序的核心算法。

示例:

private static void heapSort(int[] arr) {  
    int n = arr.length;  
    // 构建堆(升序用大顶堆,降序用小顶堆)
    buildMaxHeap(arr);  
    for (int i = n - 1; i >= 0; i--) {  
        // 把堆顶元素与最后一个元素交换位置
        int temp = arr[0];  
        arr[0] = arr[i];  
        arr[i] = temp;  
        // 删掉堆顶元素,重新构建堆
        maxHeapify(arr, i, 0);  
    }  
}  

上面是堆排序的完整代码实现。此处先构建大顶堆用于升序排列,然后循环依次取出堆顶元素,并删除。每次删除之后都需要重新构建堆,从而得到新的堆顶元素,然后再次取出、删除,如此循环迭代,最终完成排序操作。

注意事项

  1. 堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。
  2. 堆排序不稳定,可能破坏稳定性。
  3. 堆排序在序列长度较小时,被认为是不如其他排序算法的。
  4. 堆排序虽然时间复杂度比较高,但是实现起来相对简单。

总结

堆排序是比较经典的排序算法之一。它采用的是构建堆和取堆顶并删除的方式,经过多次循环迭代,最终得到有序序列。虽然时间复杂度比较高,但是实现起来相对比较简单,而且不像快速排序、冒泡排序等算法会受到数据初始排列的影响,因此具有比较稳定的性能。但是,堆排序由于是不稳定的,所以在某些场景下可能不是最佳的选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA十大排序算法之堆排序详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 线上FullGC问题排查实践——手把手教你排查线上问题

    作者:京东科技 韩国凯 一、问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决问题)。 通过泰山查看该机器内存使用情况:…

    Java 2023年5月5日
    00
  • java计算两个时间相差天数的方法汇总

    标题:Java计算两个时间相差天数的方法汇总 当我们需要计算两个日期之间相差的天数时,可以通过Java标准库提供的日期时间类来实现。下面将介绍Java计算两个时间相差天数的方法,包括两个示例。 方法一:使用Duration类 Java 8引入了Duration类,用于表示两个时间点之间的时间差,包括秒和纳秒。我们可以使用Duration.between()方…

    Java 2023年5月20日
    00
  • 解决spring boot网关gateway导致的坑,无法下载文件问题

    在Spring Boot应用程序中,我们可以使用网关gateway来实现请求路由和负载均衡。然而,在使用网关gateway时,可能会出现无法下载文件的问题。本文将详细介绍如何解决这个问题,并提供两个示例说明。 1. 问题描述 在使用网关gateway时,可能会出现无法下载文件的问题。当我们尝试下载文件时,可能会收到404错误或空白页面。 2. 解决方法 要解…

    Java 2023年5月18日
    00
  • JavaSpringBoot报错“NoClassDefFoundError”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“NoClassDefFoundError”错误。这个错误通常是由以下原因之一引起的: 缺少依赖项:如果您的应用程序缺少依赖项,则可能会出现此错误。在这种情况下,需要确保所有依赖项都已正确添加。 类路径错误:如果类路径错误,则可能会出现此错误。在这种情况下,需要确保类路径正确。 以下两个实例: 例 1 …

    Java 2023年5月5日
    00
  • 用Java生成二维码并附带文字信息

    生成二维码并附带文字信息可以通过Java中的ZXing库来实现。下面是具体的步骤: 1. 引入ZXing库 首先需要引入ZXing库,在Maven项目中可以通过添加以下依赖来引入: <dependency> <groupId>com.google.zxing</groupId> <artifactId>core…

    Java 2023年5月20日
    00
  • java中数组list map三者之间的互转介绍

    下面是“Java中数组List Map三者之间的互转介绍”的详细攻略。 一、数组与List集合之间的相互转换 1. 数组转List Array转List可以直接通过Arrays类中的asList方法实现,代码示例如下: String[] arr = new String[]{"a", "b", "c&quot…

    Java 2023年5月26日
    00
  • 深入理解Java高级特性——注解

    深入理解Java高级特性——注解 什么是注解? 注解是Java语言中的一种元程序,可以对代码进行注释和说明,实现特定的程序功能。 Java中注解的作用类似于Javadoc的文档注释,但它可以直接影响程序的运行,也可以作为元数据用于编译、运行时的验证和代码生成等用途。 注解的语法和定义方式 Java中的注解是通过 @注解名(参数名=参数值) 的方式进行声明的,…

    Java 2023年5月26日
    00
  • SpringBoot DataSource数据源实现自动配置流程详解

    下面就给你讲解一下“SpringBoot DataSource数据源实现自动配置流程详解”的完整攻略。 一、DataSource数据源实现自动配置概述 在我们开发一个项目时,需要我们配置数据源,SpringBoot提供了自动配置数据源的功能。SpringBoot对JDBC的封装使得开发人员能够快速地进行数据源配置,通过少量的配置就可以连接到数据库。 二、Da…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部