Java实现堆排序算法

 

 

1. 堆排序原理图解

 

堆排序是一种基于二叉堆(通常使用最大堆)的排序算法。其核心思想是利用堆的性质(父节点的值大于或等于子节点的值)来高效地进行排序。堆排序分为两个主要阶段:建堆和排序。

 

堆排序步骤:

 

1. 建堆:

   - 将无序数组构建成一个最大堆。

   - 从最后一个非叶子节点开始,逐个调整节点,使其满足堆的性质。

 

2. 排序:

   - 将堆顶元素(最大值)与堆的最后一个元素交换。

   - 缩小堆的范围,重新调整堆,使其满足最大堆的性质。

   - 重复上述过程,直到堆的大小为1。

 

图解示例:

 

假设数组为 `[4, 10, 3, 5, 1]`。

 

1. 初始状态:`[4, 10, 3, 5, 1]`

2. 建堆:

   - 调整节点,构建最大堆:`[10, 5, 3, 4, 1]`

3. 排序过程:

   - 将堆顶元素(10)与最后一个元素(1)交换:`[1, 5, 3, 4, 10]`

   - 调整剩余的堆(`[1, 5, 3, 4]`),使其满足最大堆的性质:`[5, 4, 3, 1]`

   - 将堆顶元素(5)与最后一个元素(1)交换:`[1, 4, 3, 5, 10]`

   - 调整剩余的堆(`[1, 4, 3]`),使其满足最大堆的性质:`[4, 1, 3]`

   - 将堆顶元素(4)与最后一个元素(3)交换:`[3, 1, 4, 5, 10]`

   - 调整剩余的堆(`[3, 1]`),使其满足最大堆的性质:`[3, 1]`

   - 将堆顶元素(3)与最后一个元素(1)交换:`[1, 3, 4, 5, 10]`

4. **最终结果**:`[1, 3, 4, 5, 10]`

 

 2. Java代码实现及注释

 

```java

import java.util.Arrays;

 

public class HeapSort {

    public static void main(String[] args) {

        int[] array = {4, 10, 3, 5, 1};

        heapSort(array);

        System.out.println("排序后的数组:");

        System.out.println(Arrays.toString(array));

    }

 

    // 堆排序主方法

    public static void heapSort(int[] arr) {

        int n = arr.length;

 

        // 建堆:从最后一个非叶子节点开始,逐个调整节点

        for (int i = n / 2 - 1; i >= 0; i--) {

            heapify(arr, n, i);

        }

 

        // 排序:交换堆顶元素与最后一个元素,然后调整堆

        for (int i = n - 1; i >= 0; i--) {

            // 交换堆顶元素与最后一个元素

            int temp = arr[0];

            arr[0] = arr[i];

            arr[i] = temp;

 

            // 调整剩余的堆

            heapify(arr, i, 0);

        }

    }

 

    // 调整堆的方法

    private static void heapify(int[] arr, int heapSize, int rootIndex) {

        int largest = rootIndex; // 假设根节点是最大的

        int leftChild = 2 * rootIndex + 1; // 左子节点

        int rightChild = 2 * rootIndex + 2; // 右子节点

 

        // 如果左子节点大于根节点

        if (leftChild < heapSize && arr[leftChild] > arr[largest]) {

            largest = leftChild;

        }

 

        // 如果右子节点大于当前最大的节点

        if (rightChild < heapSize && arr[rightChild] > arr[largest]) {

            largest = rightChild;

        }

 

        // 如果最大的节点不是根节点,交换它们

        if (largest != rootIndex) {

            int temp = arr[rootIndex];

            arr[rootIndex] = arr[largest];

            arr[largest] = temp;

 

            // 递归调整子树

            heapify(arr, heapSize, largest);

        }

    }

}

```

 

 3. 代码说明

 

1. 建堆:

   - 从最后一个非叶子节点开始,逐个调整节点,使其满足最大堆的性质。

   - 使用 `heapify` 方法调整节点。

 

2. 排序:

   - 将堆顶元素(最大值)与堆的最后一个元素交换。

   - 缩小堆的范围,重新调整堆,使其满足最大堆的性质。

   - 重复上述过程,直到堆的大小为1。

 

3. 时间复杂度:

   - **最坏情况**:`O(n log n)`。

   - **平均情况**:`O(n log n)`。

   - **最好情况**:`O(n log n)`。

 

4. 空间复杂度:

   - `O(1)`,因为堆排序是原地排序算法,不需要额外的存储空间。

 

5. 稳定性:

   - 堆排序是**不稳定的**,因为交换操作可能改变相同值元素的相对顺序。

 

4. 应用场景

 

1. 大规模数据排序:

   - 堆排序的时间复杂度为 `O(n log n)`,适合对大规模数据进行排序。

 

2. 优先队列实现:

   - 堆排序的核心思想可以用于实现优先队列,例如在任务调度中。

 

3. 教学和演示:

   - 堆排序的实现清晰,适合用于教学和算法演示。

 

 5. 总结

 

堆排序是一种高效的排序算法,基于二叉堆的性质实现。它的时间复杂度稳定在 `O(n log n)`,并且是原地排序算法,不需要额外的存储空间。然而,堆排序是不稳定的,因此在需要保持相同值元素相对顺序的场景中不适用。在实际应用中,堆排序常用于大规模数据排序和优先队列的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hive入门】Hive安全管理与权限控制:审计日志全解析,构建完善的操作追踪体系

目录 引言 1 Hive审计日志概述 1.1 审计日志的核心价值 1.2 Hive审计日志类型 2 HiveServer2操作日志配置 2.1 基础配置方案 2.2 日志格式解析 2.3 日志轮转配置 3 Metastore审计配置 3.1 Metastore审计启用 3.2 审计事件类型 4 高级审计方案 4.1 与Apache Ranger…

力扣-hot100 (缺失的第一个正数)

41. 缺失的第一个正数 困难 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff…

13前端项目----购物车修改

购物车修改 uuid临时游客身份购物车部分功能全选修改商品数量修改商品勾选状态删除产品 uuid临时游客身份 请求数据仓库发起请求 ->问题&#xff1a;获取不到购物车数据&#xff1f; 所以需要一个身份&#xff0c;告诉服务器是谁存的数据&#xff1f;是要获取谁的数据&…

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示&#xff0c;如图所示 然后就卸载&#xff0c;计划重新安装&#xff0c;安装了好几个版本&#xff0c;并且setting->file types怎么设置都展示不对&#xff0c;考虑是否idea没卸载干净&#xff…

Nginx搭建test服务器

创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "test" 表格含义: 列名含义说明id进程在…

MyBatis-Plus 非 Spring 环境使用时 `GenericTypeResolver` 缺失问题总结

MyBatis-Plus 非 Spring 环境使用时 GenericTypeResolver 缺失问题总结 问题描述 在非 Spring 环境中使用 MyBatis-Plus 3.4.3.1 及以上版本时&#xff0c;启动程序会抛出以下错误&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/s…

综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理

文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:先用mapState映射list到组件页面 4.点击修改数量…

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

《数据结构初阶》【顺序表 单链表 顺序表】 前言&#xff1a;先聊些其他的东西&#xff01;&#xff01;&#xff01;什么是线性表&#xff1f;什么是顺序表&#xff1f;顺序表的种类有哪些&#xff1f; 什么是链表&#xff1f;链表的种类有哪些&#xff1f; ---------------…

Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解

目录 Okhttp有什么不好&#xff1f;bulid的过程create方法ServiceMethodcall enqueue的过程为什么要学习源码呢&#xff1f; 一、Okhttp有什么不好&#xff1f; Okhttp本身来说&#xff0c;是一个挺好的网络框架&#xff0c;但&#xff0c;对于开发者而言&#xff0c;使用起…

C++ STL 基础与多线程安全性说明文档

C STL 基础与多线程安全性说明文档 一、STL 简介 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是 C 标准库的重要组成部分&#xff0c;提供了常用的数据结构和算法的泛型实现&#xff0c;极大地提高了代码的复用性和开发效率。 STL 的六大组…

数据结构之图的分类和存储

图 图(Graph)G由两个集合V和E组成&#xff0c;记为&#xff1a;G(V,E)&#xff0c;其中V是顶点的有穷非空集合(其实就是顶点)&#xff0c;E是V 中顶点偶对的有穷集合(就是边)。V(G)和E(G)通常分别表示图G的顶点集合以及边集合&#xff0c;E(G)可以为空集合&#xff0c;但是此时…

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…

setup 函数在 Vue 3 中的作用是什么?什么时候会执行

文章目录 前言✅ 一、setup() 函数的作用是什么&#xff1f;✅ 二、setup() 什么时候执行&#xff1f;✅ 三、setup() 的参数✅ 四、setup() 中不能做什么&#xff1f;✅ 五、常见用法示例✅ 六、总结&#xff08;适合背诵或面试回答&#xff09; <script setup> 是 **Vu…

JDBC实现--保姆级教程~

本来以为写过一个使用python与数据库连接的文章&#xff0c;但是今天突然发现没有&#xff0c;那就直接写Java与数据库连接的吧。当然如果大家有需要可以告诉我&#xff0c;有时间的话也可以写一个的pymysql的使用的。 数据库有很多种&#xff0c;接下来我就以MySQL为例来进行讲…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后台常用功能

最近些日子研究Wordpress&#xff0c;做些简单的笔记。 怎么安装Wordpress&#xff0c;怎么进的后台&#xff0c;这些咱就不唠了哈&#xff0c;网上到处是教程。 目录 1&#xff0c;Wordpress的后台 1-1&#xff0c; Posts(投稿) 1-2&#xff0c;Media(媒体) 1-3&#xf…

R8周:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.设置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败&#xff0c;失败可能成为我们前进的动力&#xff01; 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

机器人强化学习入门学习笔记(二)

基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…