【深度剖析】 堆排序为什么不稳定?!

news2024/12/23 3:56:47

文章目录

  • 零、前言
  • 一、什么是稳定性?
  • 二、不稳定的地方在哪里?



零、前言


最近做面试题中,遇到一些平时学习中比较少注意到的问题,记录下来以便后来者学习讨论。

请添加图片描述



对 堆排序 不熟悉的 可以参考 👉👉👉 【基础算法】细说十大排序!

一、什么是稳定性?


既然要讨论快速排序为什么不稳定,那么也应该明确什么是稳定性!

通常,在排序算法中,稳定性 是指如果两个元素在原始数组中的相对顺序保持不变,则在排序后它们的相对顺序也应该保持不变。
换句话说,如果有两个相等的元素,它们的位置在排序之前是 a 和 b,且 a 在 b 的前面,那么在排序后,a 仍然应该在 b 的前面。




二、不稳定的地方在哪里?


1、在建堆阶段,首先将待排序的元素构建成一个堆(大顶堆或小顶堆)。从最后一个非叶子节点开始,逐步向上调整,使得每个节点都满足堆的性质。在调整的过程中,可能需要交换节点的位置来满足堆的性质。这个交换操作会改变相同键值元素的相对顺序,从而导致排序的不稳定性。

2、在排序阶段,每次从堆顶取出最大(或最小)元素,将其放到已排序部分的末尾,然后对剩余未排序的部分进行堆调整,重复这个过程直到所有元素都被放置到正确的位置上。这个过程中同样会涉及交换操作,进一步破坏了相同键值元素的相对顺序,导致排序的不稳定性。

总结起来,堆排序是通过反复调整元素位置来完成排序的过程,其中涉及到交换操作。这些交换操作可能导致相同键值元素的相对顺序发生变化,因此堆排序是一个不稳定的排序算法。如果希望实现稳定性排序,可以选择其他稳定的排序算法,如冒泡排序、插入排序或归并排序。




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

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

相关文章

TortoiseGit 入门指南07:创建分支

Git 的 分支 出了名的好用。其它的版本控制系统也提供分支,但在易用度上,只有两类版本控制系统:一种是 Git,一种是其它。 Bob 大叔在《匠艺整洁之道》中写道: 我曾经坚持拒绝分支。在使用 CVS 和 Subversion 的时候&a…

检测到目标X-Content-Type-Options响应头缺失

详细描述 X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味…

Dynamic-SLAM2019论文翻译

Dynamic-SLAM:动态环境下基于深度学习的语义单目视觉定位与建图 摘要-传统SLAM框架在动态环境下工作时,由于受到动态对象的干扰,性能较差。为了解决动态环境下的SLAM问题,利用深度学习在目标检测中的优势,提出了一种语义同步定位…

Science Advances|上海交大王风平团队揭示深古菌与早期地球协同演化历史

Research Article,2023-7-5,Science Advances, [IF 13.6] 原文链接:https://www.science.org/doi/full/10.1126/sciadv.adf5069 第一作者:侯佳林 通讯作者:王风平,王寅炤 - 摘要 - 近日&#xf…

C++——友元

友元的定义 C 中的友元&#xff08;friend&#xff09;是一种允许非成员函数或类访问另一个类的私有或保护成员的机制。友元可以是一个普通的非成员函数、另一个类或整个类的所有成员函数。 什么情况下需要友元 现在尝试去重载operator<<&#xff0c;然后发现没办法将o…

vscode 配置ssh 免密登录 多台服务器

0、下载vscode Visual Studio Code - Code Editing. Redefined 之前一直用pycharm 但是好像社区免费版本不能连接服务器&#xff0c;还要本地同步代码&#xff0c;比较繁琐&#xff0c;因此改用vscode。 1、添加ssh 添加后可以尝试登录&#xff0c;确认下账号密码&#xff0…

linux提权总结

文章目录 常用命令反弹shell获取完整交互式SHELLLinux内核漏洞提权脏牛提权 CVE-2016-5195metasploit linux提权SUID提权passwd提权ssh密钥提权环境变量劫持提权john破解root密文计划任务提权(cron Jobs)提权脚本LinEnumlinux-exploit-suggester2linuxprivchecker docker逃逸提…

Windows 10 + WSL 2 + Ubuntu 22.04 搭建 AI 环境

参考 Enable NVIDIA CUDA on WSL 在WSL里的Ubuntu 22.04中进行以下操作前&#xff0c;请先在 Windows 10 中安装好 Nvidia驱动程序 和 CUDA Toolkit 11.7 &#xff0c;并将 cuDNN 下载后的文件复制到对应目录中 安装 Conda 23.5.2 wget https://repo.anaconda.com/archive/An…

代码随想录算法训练营第十八天 | 动态规划系列1,2,3,4

动态规划系列1,2,3,4 动态规划理论基础重点 509 斐波那契数未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 70 爬楼梯未看解答自己编写的青春版思考后自己写的代码重点代码随想录的代码我的代码(当天晚上理解后自己编写) 746 使用最小花费爬楼…

职责链模式:如何实现可灵活扩展算法的敏感信息过滤框架?

今天&#xff0c;我们主要讲解职责链模式的原理和实现。除此之外&#xff0c;我还会利用职责链模式&#xff0c;带你实现一个可以灵活扩展算法的敏感词过滤框架。下一节课&#xff0c;我们会更加贴近实战&#xff0c;通过剖析Servlet Filter、Spring Interceptor来看&#xff0…

从零开始的python入门之路

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

c语言播放MP3音乐

今天学习了一下怎么用c语言播放音乐的方法&#xff0c;为了防止忘记&#xff0c;特此记录一下&#xff0c;首先就是把要播放的mp3文件保存到和要编辑的.c文件同一个目录中&#xff0c;如图所示&#xff1a; 下面就直接看代码吧&#xff1a; #include<stdio.h> #include&…

线程中并发安全问题(Sychronized关键字的底层原理)

线程中并发安全问题 Sychronized关键字的底层原理 ​ sychronized对象锁采用互斥方式让同一时刻至多只有一个线程能持有对象锁&#xff0c;其他线程想获取这个对象锁只能被阻塞。 Monitor Sychronized的底层实现Monitor。 WaitSet&#xff1a;关联调用了wait方法的线程&a…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法&#xff0c;以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好&#xff1a; 其相比于基于补丁…

【板栗糖GIS】——buzz字幕软件的安装和使用

【板栗糖GIS】——buzz字幕软件的安装和使用 1. 下载buzz软件 链接如下&#xff1a; 下载软件包&#xff0c;我已经准备好资源&#xff0c;只是审核还未通过&#xff0c;过两天会加上&#xff0c;忘记补充链接可以私信我 2. 双击安装 直接下一步下一步 3. 使用方法介绍 运…

并发事务会有哪些问题?

并发事务会有哪些问题&#xff1f; 多个事务并发的执行一定会出现相互争夺资源的问题。那么问题具体有哪些呢&#xff1f; 脏写&#xff08;丢失修改&#xff09;脏读不可重复读幻读 以上这四个问题就是我们需要知道的。但是脏写&#xff0c;由于mysql最低的隔离级别都能避免…

gradle的下载、解压、环境变量配置以及命令行基本用法

父目录 Android 开发入门 - wuyujin1997 文章目录 Intro下载解压配置环境变量环境变量测试 命令行命令行基本用法命令行更多用法 Intro 关于Java项目的依赖、编译流程等管理&#xff0c;有三代的解决方案。 AntMavenGradle 可以想像这三代工具必定是各有特定&#xff0c;但整…

【算法 -- LeetCode】(020) 有效的括号

1、题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…

javaagent简单理解

1. javajaent是什么 javaagent可以理解为是一个插件&#xff0c;需要有一个jvm进程才能运行。例如arthas这个工具就是用到了javaagent。 2. 如何使用 1. 一种调用方式&#xff1a;java -javaagent:path[参数参数值] 2. 方法签名 public static void premain(String args, I…

从零玩转系列之SpringBoot3-核心原理

一、简介 1.前置知识 ● Java17 ● Spring、SpringMVC、MyBatis ● Maven、IDEA 2.环境要求 环境&工具版本(or later)SpringBoot3.1.xIDEA2023.xJava17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.19 二、SpringBoot3-核心原理 1.事件和监听器…