堆排序详解(Heap Sort)

news2024/11/24 20:07:24
本文已收录于专栏
《算法合集》

目录

  • 一、简单释义
    • 1、算法概念
    • 2、算法目的
    • 3、算法思想
    • 4、算法性质
  • 二、核心思想
    • 构建
    • 排序
  • 三、图形展示
    • 宏观展示
    • 微观展示
  • 四、算法实现
    • 实现思路
    • 代码实现
      • 客户端调用
      • 构造堆的方法
      • 元素交换的方法
      • 元素比较的方法
    • 运行结果
  • 五、算法描述
    • 1、问题描述
    • 2、算法过程
    • 3、算法总结
  • 六、算法分析
    • 1、时间复杂度
    • 2、空间复杂度
    • 3、算法稳定性


一、简单释义

1、算法概念

  堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

2、算法目的

  把无序数组通过转换成的形式,通过堆的各个结点比较进行交换位置,最后形成一个有序数组  (文中以大根堆为例)

3、算法思想

  将待排序的序列构造成一个大根堆 或小根堆(文中以大根堆为例),然后将堆顶元素与最后一个元素交换位置 ,再将剩余元素重新构造成一个堆,重复执行以上操作,直到整个序列有序。

4、算法性质

以大根堆为例,它总是满足下列性质:

  1. 空堆是一个大根堆
  2. 大根堆中某个结点的关键字小于等于其父结点的关键字;
  3. 大根堆是一个完全二叉树

二、核心思想

构建

  构造堆的过程就是将无序的序列构造成一个堆的过程。

排序

  将堆顶元素与最后一个元素交换位置,然后将剩余元素重新构造成一个堆的过程。

三、图形展示

宏观展示

在这里插入图片描述

微观展示

  以4、6、3、5、9这个数组为例,根据数组构建二叉堆。
在这里插入图片描述
  1、第一次排序:从叶子结点往上进行比较,首先是5和6比较,5小于6不交换位置。然后9和6进行比较,9大于6交换位置。
在这里插入图片描述
  2、第二次排序:9和4进行对比,9大于4交换位置。然后6和4进行比较,6大于4交换位置。最终的到一个最大值9。9和4交换位置继续排序。
在这里插入图片描述

  3、第三次排序:重复上述操作。
在这里插入图片描述
  4、第四次排序
在这里插入图片描述
  5、第五次排序
在这里插入图片描述

四、算法实现

实现思路

  将图形化展示的过程转换成对应的开发语言,本文中主要以Java语言为例来进行算法的实现。

  1、首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
  2、将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
  3、将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,反复执行,便能得到有序数组

  能把整个过程描述清楚实现起来才会更加容易!!!

代码实现

客户端调用

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.HeapSort
 * @Author: Wuzilong
 * @Description: 堆排序
 * @CreateTime: 2023-05-22 11:45
 * @Version: 1.0
 */

public class HeapSort {

    public static void main(String[] args) {
        int[] numArray={4,6,3,5,9};
        heapSort(numArray);

    }
}

构造堆的方法

	//构造堆的方法
    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--) {
            swap(arr, 0, i);
            heapify(arr, i, 0);
            System.out.println( Arrays.toString(arr));
        }
    }

元素交换的方法

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

元素比较的方法

    private static void heapify(int[] arr, int n, int i) {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }
        if (largest != i) {
            swap(arr, i, largest);
            heapify(arr, n, largest);
        }

    }

运行结果

在这里插入图片描述

五、算法描述

1、问题描述

  通过给定的数据集合,创建堆。可以先创建堆数组的内存空间。然后一个一个执行堆的插入操作。

2、算法过程

整个算法过程分为以下几步:
  1)将待排序序列构造成一个大根堆或小根堆。
  2)将堆顶元素与最后一个元素交换位置,堆的大小减一。
  3)对剩余元素重新构造成一个堆。
  4)重复执行步骤 2 和步骤 3,直到整个序列有序。

3、算法总结

  构造的过程就是将无序的序列构造成一个堆的过程。堆的定义是:对于任意一个非叶子节点 i,其左子节点为 2i+1,右子节点为 2i+2,且父节点的值大于等于(或小于等于)其子节点的值。因此,我们可以从最后一个非叶子节点开始,依次将其与其子节点比较,如果不满足堆的定义,则交换位置,直到整个序列构造成一个堆为止。
  排序的过程就是将堆顶元素与最后一个元素交换位置,然后将剩余元素重新构造成一个堆的过程。每次交换后,堆的大小减一,因此我们可以通过一个变量来记录堆的大小,从而将排序的过程限制在堆的范围内。

六、算法分析

1、时间复杂度

  堆排序是一种基于二叉堆的排序算法,其时间复杂度:最好、最坏和平均均为 O(nlogn)

2、空间复杂度

  堆排序是一种原地排序算法,所以空间复杂度为 O(1)。

3、算法稳定性

  堆排序是一种不稳定的排序算法。在堆排序过程中,由于交换堆顶元素和最后一个元素的位置可能会改变相同元素之间的相对顺序,所以堆排序不是稳定的排序算法。


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

如何在 Windows 10 上查找电脑型号

在Windows 10上,计算机型号在许多情况下都可以派上用场。例如,型号可以更容易地找到正确的硬件升级(如内存、存储驱动器、显示器和电源)。或者,如果你必须解决问题或联系技术支持。它还可以方便地将设备编目到库存中。 尽管制造商通常在笔记本电脑或台式机的机箱上使用贴…

Android SDK研发解决方案宝典

Android SDK研发很难整&#xff0c;非常烧脑&#xff0c;与app研发有很多不同。 遇到的问题有很多&#xff0c;各种崩溃&#xff0c;各种空指针&#xff0c;各种冲突需要解决。 所以开发前一定要提前规划好&#xff0c;做好规范。我把我这边一些问题做了记录和分享。 问题1&…

获取订单API接口系列,可接入erp系统场景

抖音和拼多多是目前国内最为火爆的社交和电商平台&#xff0c;为了让更多的开发者能够轻松利用其庞大的用户基础和活跃度&#xff0c;我们提供了相关的订单接口&#xff0c;可帮助开发者快速便捷地完成订单的创建、查询、调整等操作&#xff0c;从而更好地促进业务的发展。以下…

React项目搭建

一、项目搭建&#xff08;不采用vite方式&#xff09; 使用create-react-app生成项目 npx create-react-app pc 进入根目录 cd pc 启动项目 npm start 调整项目目录结构 /src/assets 项目资源文件&#xff0c;比如&#xff0c;图片 等/components 通用组件/pag…

分布式事务解决方案探讨

分布式事务解决方案 一、什么是事务&#xff1f;二、什么是分布式事务&#xff1f;三、分布式事务的理论模型3.1 X/Open 分布式事务模型3.1.1 X/Open事务执行流程3.1.2 XA 协议 3.2 两阶段提交协议3.3 三阶段提交协议 四、分布式事务场景解决方案4.1 TCC补偿方案4.2 基于可靠性…

密码学基本原理和发展——近代密码学

目录 1 密码机通信模型 2 Enigma密码机构造 3 Enigma密码机加解密过程 3.1 加密过程 3.2 解密过程 4 Enigma密码机的安全性 5 Enigma密码机破解 5.1 波兰雷耶夫斯基破解 5.2 图灵破解 近代密码一般指20世纪初&#xff5e;20世纪70年代期间的密码技术。20世纪初电报的出…

快速上手项目1:基于FaceNet的人脸识别项目

快速上手项目1&#xff1a;基于FaceNet的人脸识别项目 说明 ​ 本来想自己复现一下facenet的&#xff0c;但是发现facenet已经被做成了python的第三方库&#xff0c;于是自己用了用&#xff0c;发现挺简单的&#xff0c;然后又看了看源码&#xff0c;感觉模型架构实现部分很简单…

说说 HWND_TOP 和 HWND_TOPMOST 的区别

初看上去&#xff0c;HWND_TOP 和 HWND_TOPMOST 有点类似&#xff0c;但是实际上在调用 DeferWindowPos 或者 SetWindowPos时&#xff0c;它们之间的差别还挺大。 在同级窗口的维护机制中&#xff0c;有一个概念叫做 Z 序 (Z-order) 。出于此讨论的目的&#xff0c;顶级窗口也…

音容笑貌,两臻佳妙,人工智能AI换脸(deepfake)技术复刻《卡萨布兰卡》名场面(Python3.10)

影史经典《卡萨布兰卡》是大家耳熟能详的传世名作&#xff0c;那一首壮怀激烈&#xff0c;激奋昂扬的马赛曲&#xff0c;应当是通片最为激动人心的经典桥段了&#xff0c;本次我们基于faceswap和so-vits库让AI川普复刻美国演员保罗亨雷德高唱《马赛曲》的名场面。 配置人脸替换…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 8 Advertising on the Web

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 8 Advertising on the Web There are several factors that must be considered in evaluating ads: The position of the ad in a list has great influence on whether or not it is clicked.…

Linkage Mapper 之 Barrier Mapper 功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 大草原松鸡"(Greater Sage Grouse)的Lek Kernals(即HCAs),以及连接、连接障碍和恢复机会效果图: 图片

python+Django音乐播放器网站系统0tr3w

音乐网站系统的后台开发目标是以信息管理系统的管理和开发方法&#xff0c;用目前现有的新技术进行系统开发&#xff0c;提供后台管理员高度友好的界面操作以及迅捷的信息处理。而前台的开发目标是以用户的需求作为主导&#xff0c;提供对用户而言非常友好的界面操作环境以及完…

实时频谱-1.1基本概念

RF信号 RF&#xff08;射频&#xff09;是Radio Frequency的缩写&#xff0c;表示可以辐射到空间的电磁频率&#xff0c;频率范围从300KHz&#xff5e;30GHz之间。 中频 IF(intermediate frequency)&#xff0c;用来在中频衡量AM或FM调谐器抑制外来干扰的能力&#xff0c;数…

基于springboot在线外卖系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;…

You Only Look Once: 革命性目标检测算法论文解析

You Only Look Once 全论文完整翻译 You Only Look Once: Unified, Real-Time Object Detection 摘要 我们介绍了一种名为YOLO的新型目标检测方法。在目标检测的先前工作中&#xff0c;人们将分类器重新应用于执行检测任务。相反&#xff0c;我们将目标检测视为一个回归问题&a…

ChatGPT 的议论文究竟写的怎么样?111 位高中教师告诉你答案

夕小瑶科技说 原创 作者 | 小戏、Python 在 OpenAI GPT-4 发布时发布的《GPT-4 Technical Report》中&#xff0c;其中很吸引人眼球的一部分是 GPT-4 应用于教育领域的出色表现&#xff0c;通过让 GPT-4 去完成美国的 AP 课程及考试&#xff0c;来评估 GPT-4 在多个学科中的性…

WIN提权补丁提权,at,sc,psexes提权

win提权分为web和本地提权 web提权就是getshell后&#xff0c;权限是网站权限&#xff0c;要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限&#xff0c;所以本地提权成功概率比web提权概率大 因为我们做渗透测试&#xff0c;一般都是从网站入侵。所以大…

OpenAI最新iOS版ChatGPT下载使用手册:三步快速下载,支持语音输入和历史聊天记录重新对话(免费、比网页端响应快、亲测可用)

目录 前言ChatGPT移动端与网页端相比的优势步骤一&#xff1a;注册美区Apple id账号步骤二&#xff1a;苹果手机切换appstore id步骤三&#xff1a;下载ChatGPT IOS移动版APP畅玩ChatGPT APP体验总结其它资料下载 &#xff01; 前言 北京时间5月19日凌晨&#xff0c;OpenAI重…

散点图(Scatter Plot)

目录 1、散点图 2、随机数据分布 1、散点图 散点图是数据集中的每个值都由点表示的图 Matplotlib 模块有一种绘制散点图的方法&#xff0c;它需要两个长度相同的数组&#xff0c;一个数组用于 x 轴的值&#xff0c;另一个数组用于 y 轴的值 x [5,7,8,7,2,17,2,9,4,11,12,9…

2023最新网络安全面试题大全

2023年快过去一半了&#xff0c;不知道小伙伴们有没有找到自己心仪的工作呀【doge】&#xff0c;本文总结了常见的安全岗位面试题&#xff0c;方便各位复习。祝各位事业顺利&#xff0c;财运亨通。在网络安全的道路上越走越远&#xff01; 所有的资料都整理成了PDF&#xff0c…