堆排序详细讲解(一文足矣JAVA)

目录

1、什么是堆

2、大顶堆

3、小顶堆

4、排序思想:

5、代码实现


1、什么是堆

在计算机科学中,堆(Heap)是一种特殊的数据结构,通常是一个可以被看作近似完全二叉树的数组对象。在堆中,父节点的值总是大于或等于子节点的值(大顶堆),或者父节点的值总是小于或等于子节点的值(小顶堆)。

堆分为两种主要类型:

2、大顶堆

 在大顶堆中,父节点的值大于或等于其任何一个子节点的值。因此,堆的根节点包含的是整个堆中的最大值。

3、小顶堆

在小顶堆中,父节点的值小于或等于其任何一个子节点的值。因此,堆的根节点包含的是整个堆中的最小值。

堆常常用于实现优先队列和堆排序等算法。堆排序正是利用堆的特性进行的一种排序算法。

堆的特点:

  • 堆是一个完全二叉树,即除了最后一层,其他层的节点都是满的,最后一层的节点尽量靠左排列。
  • 在堆中,父节点和子节点之间存在特定的大小关系,满足堆的性质。

堆的操作包括插入(将新元素添加到堆中)和删除(从堆中移除某个元素)。这两个操作会触发堆的调整,以保持堆的结构和性质。

在实现上,堆通常以数组的形式存储,可以通过数组索引的关系来找到父节点和子节点。这种数组表示法使得堆的操作更加高效。

4、排序思想:

它的排序思想主要分为两个步骤:

1、构建堆;

2、排序;

构建堆:

  • 首先,将待排序的数组看作是一个完全二叉树,并从最后一个非叶子节点开始向前遍历。
  • 对于每个节点,进行一次“堆化”操作,即将当前节点与其子节点比较,如果当前节点的值小于(或大于,取决于是小顶堆还是大顶堆)子节点的值,则交换它们的位置。
  • 重复这个过程,直到整个数组变成一个满足堆性质的堆。这一步的时间复杂度为O(n),其中n是数组的长度。

排序:

  • 构建好堆之后,堆顶元素是最大值(大顶堆)或最小值(小顶堆)。
  • 将堆顶元素与堆的最后一个元素交换位置,然后将剩余元素重新调整为堆,除了最后一个元素,其余部分仍然保持堆的性质。
  • 重复上述步骤,每次将堆中最大(或最小)的元素放到数组的末尾,直到整个数组有序。

堆排序的关键在于构建和调整堆的过程。构建堆的时间复杂度是O(n),排序阶段进行n-1次交换和堆调整,每次的时间复杂度是O(log n)。因此,堆排序的总体时间复杂度是O(n log n),其中n是数组的长度。

堆排序是一种原地排序算法,不需要额外的辅助数组。它的优点在于对于大规模数据集的排序比较高效,但缺点是相对于一些其他排序算法,它对于小规模数据集的性能可能不如其他算法。此外,堆排序是不稳定的排序算法。

5、代码实现

public class HeapSort {

    public static void heapSort(int[] array) {
        int n = array.length;

        // 构建大顶堆
        buildMaxHeap(array, n);

        // 排序
        for (int i = n - 1; i > 0; i--) {
            // 将堆顶元素(最大值)与数组末尾元素交换
            swap(array, 0, i);

            // 重新调整堆,排除已排序的部分
            maxHeapify(array, i, 0);
        }
    }

    // 构建大顶堆
    private static void buildMaxHeap(int[] array, int n) {
        for (int i = n / 2 - 1; i >= 0; i--) {
            maxHeapify(array, n, i);
        }
    }

    // 堆调整,使得以i为根节点的子树满足大顶堆的性质
    private static void maxHeapify(int[] array, int n, int i) {
        int largest = i; // 初始化父节点为最大值
        int leftChild = 2 * i + 1; // 左子节点
        int rightChild = 2 * i + 2; // 右子节点

        // 找出左右子节点中的最大值
        if (leftChild < n && array[leftChild] > array[largest]) {
            largest = leftChild;
        }
        if (rightChild < n && array[rightChild] > array[largest]) {
            largest = rightChild;
        }

        // 如果最大值不是父节点,则交换它们的位置并继续调整
        if (largest != i) {
            swap(array, i, largest);
            maxHeapify(array, n, largest);
        }
    }

    // 交换数组中两个元素的位置
    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    // 测试堆排序
    public static void main(String[] args) {
        int[] array = {4, 10, 3, 5, 1};
        System.out.println("Original Array: " + Arrays.toString(array));

        heapSort(array);

        System.out.println("Sorted Array: " + Arrays.toString(array));
    }
}

 这段代码首先调用 buildMaxHeap 构建初始的大顶堆,然后进行堆排序,最终得到一个有序数组。 maxHeapify 方法用于在堆排序中调整堆的结构,确保它仍然满足大顶堆的性质。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四通道轨-轨运算芯片 D8054,外围应用简便,低功耗2.3mA (典型值)运放供电电流

D8054是一款四通道轨-轨运算放大器&#xff0c;外围应用简便&#xff0c;价格低廉。封装形式为SOP14&#xff0c;TSSOP14&#xff0c; SOP16&#xff0c; TSSOP16。 主要特点&#xff1a; ● 轨-轨输出&#xff0c;输出失调2mV (典型值) ● 高速250MHz&#xff0c;-3dB带…

网络细节核心笔记

来源&#xff0c;做个笔记&#xff0c;讲的还蛮清楚通信原理-2.5 数据封装与传输05_哔哩哔哩_bilibili 交换机

java人工智能交互医院智慧导诊系统源码

随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智能导诊导医逐渐出现在患者的生活视角中&#xff0c;智能导诊系统应用到医院就医场景中&#xff0c;为患者提供导诊、信息查询等服务&#xff0c;符合智慧医院建设的需…

python代码样式规范

https://peps.python.org/pep-0008/

微软 Power Platform 零基础 Power Pages 网页搭建实际案例实践(三)

微软 Power Platform 零基础 Power Pages 网页搭建教程之案例实践学习&#xff08;三&#xff09;结合Power Apps和Power Automate Power Pages 实际案例学习 微软 Power Platform 零基础 Power Pages 网页搭建教程之案例实践学习&#xff08;三&#xff09;结合Power Apps和Po…

「Verilog学习笔记」时钟分频(偶数)

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule even_div(input wire rst ,input wire clk_in,output wire clk_out2,output wire clk_out4,output wire clk_out8); //********…

鸿蒙Harmony应用开发,一起来写一个“遥遥领先”的开眼App

前言 最近不知道怎么鸿蒙Harmony突然就很火&#xff0c;到处都是鸿蒙开发相关的文章&#xff0c;培训机构的也是各种推鸿蒙应用&#xff0c;不知道是真的&#x1f525;了&#xff0c;还是在贩卖焦虑&#xff01;不过看热度不错&#xff0c;那也就来了解了解咱们的遥遥领先&…

css悬浮展示隐藏内容,从下向上展示

标题 <div class"cont"><div class"box"><img src"./images/1.jpg" alt""><p class"title">无锡2日1晚自由行(5钻)【5.23-5.25抢购】</p><div><p class"txt_a">席位充…

Java 并发编程面试题——Java 线程间通信方式

目录 1.✨Java 线程间有哪些通信方式&#xff1f;1.1.volatile 和 synchronized 关键字1.2.等待/通知机制1.2.1.概述1.2.2.经典范式 1.3.管道输入/输出流1.4.信号量 2.Thread.join() 有什么作用&#xff1f;它的使用场景是什么&#xff1f;3.Java 中需要主线程等待子线程执行完…

计算机毕设:基于机器学习的生物医学语音检测识别 附完整代码数据可直接运行

项目视频讲解: 基于机器学习的生物医学语音检测识别 完整代码数据可直接运行_哔哩哔哩_bilibili 运行效果图: 数据展示: 完整代码: #导入python的 numpy matplotlib pandas库 import pandas as pd import numpy as np import matplotlib.pyplot as plt #绘图 import se…

【STM32入门】3.OLED屏幕

1.OLED引脚 OLED屏幕的接线按图所示&#xff0c;本例中用的是4管脚OLED屏幕 2.驱动程序 配套的驱动程序是“OLED.c"&#xff0c;主要由以下函数构成&#xff1a;1、初始化&#xff1b;2、清屏&#xff1b;3、显示字符&#xff1b;4、显示字符串&#xff1b;5、显示数字…

python中的输入输出

文章目录 输入函数input()例子1.如何输入获得两个字符串?&#xff08;若输入abc def或abc,def)2.如何输入获得两个整数?&#xff08;若输入34,567)3.如何输入后获得一个元素均为数值型的列表?&#xff08;若输入12,3.4,567或[12,3.4,567]&#xff09; 输出输出函数print()pr…

Windows或mac要远程控制小米手机,用什么软件?

想要远程控制小米手机的各位不用烦恼&#xff0c;其实用AirDroid就可以直接解决跨品牌跨系统远程控制小米手机的问题。AirDroid是一种广泛使用的远程控制软件&#xff0c;专为安卓设备设计&#xff0c;可以让你在任何地方访问和控制你的小米手机。 不管你用的是哪个品牌的台式电…

HNU-电路与电子学-2017期末A卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“…

TikTok与时事:短视频如何塑造社会对话?

在信息传递日益迅速的数字时代&#xff0c;社交媒体成为塑造社会对话的重要平台之一。而TikTok&#xff0c;作为一款以短视频为特色的社交应用&#xff0c;正逐渐崭露头角&#xff0c;影响着社会对时事的看法和态度。本文将深入探讨TikTok在时事讨论中的作用&#xff0c;以及短…

学习ShardingSphere前置知识

学习ShardingSphere前置准备知识 一. SPI SPI&#xff08;Service Provider Interface&#xff09;是一种Java的扩展机制&#xff0c;用于实现组件之间的松耦合。在SPI模型中&#xff0c;服务提供者&#xff08;Service Provider&#xff09;定义了一组接口&#xff0c;而服务…

Python基础之Pip使用全攻略

文章目录 1\. 引言Python的包管理器的重要性为什么需要了解和使用Pip 2\. Pip的基本概念什么是PipPip的历史和发展Pip与其他Python包管理工具的比较 3\. Pip的安装和配置在不同操作系统上安装Pip的方法Pip版本的检查和升级Pip的基础配置 4\. 国内多个镜像源及使用方法常用的国内…

boost::throw_exception错误:修改VS代码生成异常选项为/EHsc

VS2013添加boost头文件和库文件路径后&#xff0c;代码编译报错&#xff1a; 错误 LNK2019 无法解析的外部符号 “void __cdecl boost::throw_exception(class std::exception const &)” (?throw_exceptionboostYAXAEBVexceptionstdZ)&#xff0c;该符号在函数 “public:…

开源项目CuteSqlite开发笔记(二):SQLite的架构

在开发CuteSqlite图形客户端的时候&#xff0c;需要用到SQL的语法解释&#xff0c;来对SQL语句进行优化。找了很多的SQL语法解释器&#xff0c;都不是十分满意&#xff0c;只有翻开Sqlite的源码&#xff0c;看看SQLite对SQL语句的解释过程&#xff0c;本文是翻译的官方文档。 官…

010 数据结构_红黑树

前言 本文将会向你介绍红黑树的概念、性质&#xff0c;以及如何手撕红黑树 1 文章重点 文本首先引入红黑树的概念和性质&#xff0c;性质非常重要对于后面的插入操作来说&#xff0c;文章的核心放在了插入部分&#xff0c;另外看插入部分之前记得看声名和节点的定义哦~ 2 引…