【数据结构】排序算法(快速排序、归并排序、排序算法总结)

news2024/11/22 17:57:57

当你清楚的知道自己想要什么,并且意愿非常强烈的时候,你总会有办法得到的。💓💓💓

目录

 ✨说在前面

🍋知识点一:快速排序

• 🌰1.快速排序介绍

• 🌰2.霍尔排序

•🔥三数取中优化

•🔥小区间优化

• 🌰3.前后指针法

• 🌰4.快排非递归方法

🍋知识点二:归并排序

 • 🌰1.归并排序介绍

 • 🌰2.归排非递归方法

🍋知识点三:排序算法总结

  • 🌰1.复杂度即稳定性分析

  • 🌰2.排序性能比较

 • ✨SumUp结语


 ✨说在前面

亲爱的读者们大家好!💖💖💖,我们又见面了,上一篇文章中我带大家学习了冒泡排序、插入排序、希尔排序、选择排序、堆排序和计数排序,如果大家没有掌握好,可以再回去看看,复习一下,再进入今天的内容。

今天我们将要学习的排序有——快速排序(霍尔法、左右指针法、非递归)、归并排序(递归、非递归)。如果大家准备好了,那就接着往下看吧~

  👇👇👇
💘💘💘知识连线时刻(直接点击即可)

  🎉🎉🎉复习回顾🎉🎉🎉

        【数据结构】排序算法(冒泡排序、插入排序、希尔排序、选择排序、堆排序、计数排序)

  博主主页传送门:愿天垂怜的博客

​ 

 

🍋知识点一:快速排序

• 🌰1.快速排序介绍

快速排序(Quick Sort)是一种非常高效的排序算法,由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

以霍尔版本示例:

 

• 🌰2.霍尔排序

快速排序霍尔法基于分治法的策略来将一个大列表(或数组)分为两个较小的子列表,这两个子列表分别包含原列表中所有小于和大于某个“基准”(pivot)值的元素。然后,递归地对这两个子列表进行相同的操作,直到整个列表变得有序。

霍尔法基本思想:

  1. 选择基准值从待排序的列表中选出一个元素作为基准值。选择基准值的方法有多种,如选择第一个元素、最后一个元素、中间元素,或者使用更复杂的策略如“三数取中”法来选择,以期望得到更平衡的分区。

  2. 分区操作重新排列列表,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准的后面(相等的数可以到任一边,但通常放在基准的一边以保持稳定性,尽管快速排序本身不是稳定的排序算法)。这一步是快速排序的核心,也是它名称的由来——通过一次分区操作,列表就被“快速”地分成了两部分。

  3. 递归排序递归地对基准值左右两边的子列表进行快速排序。由于分区操作保证了基准值左边的所有元素都不大于基准值,右边的所有元素都不小于基准值,因此可以独立地对这两个子列表进行排序。

  4. 终止条件递归的终止条件是子列表的大小为0或1,即不需要再排序。

 代码如下:

void QuickSort(int* arr, int left, int right)
{
	assert(arr);
    //保证区间存在且元素大于1
	if (left >= right)
		return;
    //记录基准值
	int keyi = left;
    //记录区间端点值
	int begin = left, end = right;
	while (begin < end)
	{
        //找比基准值大的数
		while (arr[end] >= arr[keyi] && begin < end)
			end--;
        //找比基准值小的数
		while (arr[begin] >= arr[keyi] && begin < end)
			begin++;
        //找到后交换
		Swap(arr + begin, arr + end);
	}
    //交换keyi与begin的值
	Swap(arr + left, arr + keyi);
	keyi = begin;
    //递归左右区间
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);
}

霍尔法时间复杂度分析:

  1. 最好情况:在最好情况下,即每次分区操作都能将数组划分为两个大小相等的部分,此时快速排序的时间复杂度为O(nlogn)。这是因为每次分区后,问题规模减半,递归深度为logn,每层递归需要遍历数组一次,所以总的时间复杂度是O(nlogn)。

  2. 最坏情况:在最坏情况下,例如排序序列本身为有序,此时快速排序的时间复杂度退化到O(n^2)。这是因为每次分区操作只能排除一个元素,那么总的消耗与递归深度成等差数列,总的时间复杂度是O(n^2)。

  3. 平均情况:平均情况下,快速排序的时间复杂度也是O(nlogn)。这是通过随机选择基准元素或采用其他策略(如三数中值分割法)来减少最坏情况发生的概率来实现的。

稳定性分析:

  1. 快速排序的不稳定性
    在快速排序的过程中,通过选取一个基准元素(keyi),将数组分为两部分,小于基准的元素放在基准前面,大于基准的元素放在基准后面。这个过程中,如果数组中存在两个相等的元素,并且这两个元素分布在基准的两侧,那么在交换过程中,它们的相对位置很可能会发生改变。具体来说,当基准元素与某个大于它的元素交换时,如果基准元素原本与某个等于它的元素相邻,且该等于它的元素在基准的另一侧,那么交换后,这两个相等元素的相对位置就发生了改变。

  2. 实例说明
    考虑一个序列 [6,6,6,5,6,6,6],如果选取第一个元素6作为keyi,进行一趟快速排序后,得到 [5,6,6,6,6,6,6] 。在这个例子中,显然6的相对位置发生了改变,因此快速排序是不稳定的。

总结:霍尔法的时间复杂度为O(nlogn),但某些情况下会退化到O(n^2),是不稳定的排序算法。

左边做key,右边先走为什么可以保证相遇的位置一定比key要小?

  1. L遇R:R先走,停下来,R停下来的条件是遇到比key小的值,R停下的位置一定比key小。此时,即L没有找到大的,遇到R停下了。

  2. R遇L:R先走,找小,没有找到比key小,直接和L相遇了,L停留的位置是上一轮交换的位置,上一轮交换,把比key小的值换到L的位置了。

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

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

相关文章

jvm调优参数

JVM调优是指调整JVM的参数&#xff0c;以优化Java程序的性能。以下是一些常用的JVM调优方法&#xff1a; 1.堆内存大小&#xff1a;通过-Xms和-Xmx参数设置JVM的初始堆内存和最大堆内存。堆内存太小会导致频繁GC&#xff0c;太大则可能导致内存利用率不高。 2.新生代与老年…

Java 设计模式之策略模式 (Strategy Pattern) 详解

Java 设计模式之策略模式 (Strategy Pattern) 详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在定义一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互相替换&#xff0c;从而使得算法的变化不会影响使用算法的…

掩码、反掩码、通配符的区别和计算方式

注&#xff1a;几篇文章合集捋清掩码、反掩码、通配符的区别。 ACL 通配符&#xff0c;子网掩码&#xff0c;反掩码区别和计算方式 192.168.1.1 255.255.255.0 掩码&#xff1a; 1111111111111111000000000 左边永远是 1&#xff0c;右边永远是 0 1 和 0 &#xff0c;永远不…

UE Spinbox 控件支持Double类型及Float精度问题

UE Spinbox 控件支持Double类型及Float精度问题 问题 众所周知&#xff0c;使用float来表示GIS坐标时&#xff0c;往往由于坐标的有效数字超过7位时&#xff0c;无法表达坐标的小数部分&#xff0c;即精度不够。 方案 1、取区域中心点的局部坐标的形式&#xff0c;使得坐标…

C#列表按照日期进行从大到小排序

C#列表按照日期进行从大到小排序

多路径 bbr mpbbr 公平性推演

mptcp 推出很久了&#xff0c;先看 rfc6356 三原则&#xff1a; 对自己&#xff0c;mptcp 的吞吐不能比用 sp(single path)tcp 时更差&#xff1b;对它者&#xff0c;mptcp 子流对资源的占用不能侵害其它 sptcp 流量&#xff1b;负载分担&#xff0c;要将孬 subflow 流量分担到…

Unity Rigidbody 踩坑记录

1&#xff1a;两个带有刚体的物体碰撞会一直不停的弹 把被动受力的刚提的 Freeze Position 的勾选 去掉&#xff08;碰到过一次&#xff0c;有一种受力无法释放又返回给目标的 所以一直弹跳的感觉&#xff09; 2&#xff1a;子物体 和父物体 都有刚体的情况下 子物体 Freeze R…

WEB渗透Web突破篇-PHP文件包含下载读取

php任意文件读取/下载 readfile()、file_get_contents()、fopen()等读文件的函数不严谨&#xff0c;读取文件路径可控&#xff0c;输出内容。 下载配置文件 Redis、Weblogic、ftp、mysql、web配置文件、history文件、数据库配置文件 下载log文件 下载web文件 /1.php?f../../e…

C#实现数据采集系统-配置文件化

系统优化-配置 配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。 所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。 配置代码: 如果我们有100个采集,一个个去…

ReactiveStream

消息传递是响应式核心 ReactiveStream规范核心接口 ReactiveStream发布数据 发布者要保存订阅者 发布者要知道谁要拿他的数据&#xff0c;发布者要知道他把数据要给谁 reactive stream发布订阅的写法 subscribe订阅者 publish发布者 subscription 绑定关系 onXXX事件…

MySQL:基础增删查改

MySQL&#xff1a;基础增删查改 插入插入冲突 查询distinctwhereorder bylimit 删除deletetruncate 更新 插入 基本插入语法&#xff1a; insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应如果插入时数据完全…

药明康德:头顶达摩克利斯之剑

头顶达摩克里斯之剑&#xff0c;CXO龙头——药明康德的日子好过吗&#xff1f; 在行业下行周期、美国法案阴霾压力之下&#xff0c;药明康德交出今年上半年的成绩单&#xff0c;营收净利双双下滑&#xff0c;净利润更是同比减少20.2%。 看起来情况糟糕&#xff0c;但显然让被法…

基于YOLOv8的船舶检测系统

基于YOLOv8的船舶检测系统 (价格85) 包含 【散货船&#xff0c;集装箱船&#xff0c;渔船&#xff0c;杂货船&#xff0c;矿砂船&#xff0c;客船】 6个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该…

【竞技宝】DOTA2雪如意:ame水人逆转 XG力克NAVI

北京时间2024年8月2日,DOTA2雪如意杯在昨天将迎来淘汰赛首个比赛日,本日一共进行四场比赛,第二场比赛由NAVI对阵XG。本场比赛双方前两局战至1-1平,决胜局XG前期局势很劣,但中期拖住局势等到了ame水人装备成型,最终XG2-1击败NAVI。以下是本场比赛的详细战报。 第一局: 首局比赛…

领夹无线麦克风哪个牌子好,麦克风哪个好,2024年无线麦克风推荐

​无论是采访、Vlog还是直播&#xff0c;清晰的音频录制都极为重要。作为一名有经验的自媒体人&#xff0c;我深知哪些无线领夹麦克风能够在不破坏预算的情况下提供出色的录音效果。以下是我个人推荐的几个高性能、低价位的无线领夹麦克风&#xff0c;它们将使你的音频录制更上…

深度学习,机器学习,强化学习

深度学习、机器学习、python、人工智能项目代做和指导答疑&#xff5e;擅长&#xff08;svm、罗辑回归、贝叶斯、决策树、xgboost等&#xff09;机器学习算法、各种opencv图像处理、图像分类模型&#xff08;vgg、resnet、mobilenet、efficientnet、densenet等&#xff09;、人…

协同作战:Axure 团队协作功能全解析

前言 在当今快节奏的数字产品开发领域&#xff0c;团队协作不仅是成功的关键&#xff0c;更是创新的催化剂。 Axure&#xff0c;作为一款领先的原型设计工具&#xff0c;其内置的团队协作功能为设计师、产品经理和开发人员提供了一个无缝的沟通和协作平台。 让我们一起探索这…

每日一题——贪心算法

1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 一开始有点理解错他的意思&#xff0c;以为是i是题目中会给出&#xff0c;所以一开始没有什么思路&#xff0c;然后当看了题解之后&#xff0c;就知道了原来i是自己订的&#xff0c…

【hloc】 项目流程

hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤&#xff0c;从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件&#xff0c;用户可以方便地运行整个流程。 1. 数…

PLC-Recorder对于数据采集时间戳偏差的修正功能

目录 一、修正原理 二、使用步骤 1、初始状态&#xff0c;计算修正系数 2、启动和使用 3、修正系数的手动修改 三、修正前后的效果对比 1、修正前的时间偏差曲线 2、修正后的效果曲线 四、注意事项 1、控制器可能的时钟波动 2、平移参数评估 3、参数保存 五、关于…