分享好友 最新动态首页 最新动态分类 切换频道
C++快速排序及优化方案详解
2024-12-27 01:28
  1. 首先设定一个分界值,通过该分界值将数组分成左右两部分。
  2. 将大于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边,而等于分分界值的部分放在相对中间的部分。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于分界值,相对中间的部分的的数据等于分界值。
  3. 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
  4. 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

原始的快速排序相对来说会比较熟悉点,大致的部分流程图如图所示:

直接上代码:

快速排序的最优的情况时的时间复杂度为O(N*logN) 因为最优解在排序过程中每次都利用递归将数组不断二分,并且不断二分过程次相当于二分法,而二分的时间复杂度为logN(这里的log是以2为底的),每次二分的各个子数组的和均为n个元素,在排序过程中所有元素在不同的递归过程中均会被遍历比较,所以每次都会有N个元素会被遍历,即时间复杂度为:O(N*logN) 最坏的情况时的时间复杂度为O(N^2) 这种情况是当数组有序的情况下,每次基准值都是取了数组中的最小值或最大值,而且每次递归都只是排除了基准值那个元素,这里就很像冒泡排序不断将子数组中最值排除掉,而冒泡排序的时间复杂度为O(N^2)。 因此最坏情况下的时间复杂度为O(N^2)。

上一节我们自己动手写的一个快速排序的算法,在进行毫无规则的数组排序过程中表现得非常好,但是,当我们去百万,十万级别量的数据进行排序并且高度的有序化时,我们会发现此时程序运行的过程中,发现快速排序的效率变得异常的低下,会比相同数据量的数组中的数据是毫无规则时效率低得多了,近似退回了O(n^2)的复杂度,而此时程序则需要等待非常长的时间才能执行完全。 在编写快排代码的过程中,我们是利用递归来对数组进行划分的,这和归并排序里面的利用递归使得不断的二分才能达到O(n*logn)的时间复杂度相似,在快速排序中最好的情况就是如同归并一样,每次都是二分,这种情况的时间复杂度是最佳的时间复杂度O(n*logn)。如图:

但是当数组高度有序化或者数组本来就是有序的时候,这个时候数组数据呈现出一边倒的趋势此时快速排序的时间复杂度达到最坏的情况逼近O(n^2) 甚至达到为O(n^2),这样的快速排序远远达不到我们的需求,如图:

在这种情况下我们可以通过随机获取每次排序的基准值来进行优化int temp = vec[rand()%(R-L+1)+L];,同时通过百万、十万级别量的数据量来计算程序运行的时间比较时间复杂度。

计算时间的代码如下:

通过随机获取基准值优化代码如下:

此时没有经过优化的代码执行时间如图:

经过优化的代码执行时间如图:

两者相对比较而言进行优化的时间复杂度远远小于未经过优化的。但是在数组里面的数据是乱序的情况下,经过优化的时间复杂度会偶尔出现略高于未经过优化的情况,但影响并不是很大。

接着前面所介绍来说,当我们排序的是一个近乎有序的序列时,快速排序会退化到一个O(n^2) 级别的排序算法,而我们对此的就是引入了随机化快速排序算法;但是问题又来了,当我们排序的数据是一个数值重复率非常高的序列时,或者是输入的数据完全相同的情况时,此时随机化快速排序算法就不再起作用了,而将会再次退化为一个O(n^2) 级别的排序算法。 在这种情况下不管是>=temp还是<=temp,当我们的序列中存在大量重复的元素时,排序完成之后就会将整个数组序列分成两个极度不平衡的部分,甚至更恶劣的情况是所有数据均一样而出现一边倒的趋势,所以又退化到了O(n^2) 级别的时间复杂度,这是因为对于每一个"基准"元素来说,重复的元素太多了,如果我们选的"基准"元素稍微有一点的不平衡,那么就会导致两部分的差距非常大;即时我们的"基准"元素选在了一个平衡的位置,但是由于等于"基准"元素的元素也非常多,也会使得序列被分成两个及其不平衡的部分,那么在这种情况下快速排序就又会退化成O(n^2) 级别的排序算法。 在这里我们可以使用二路快速排序进行优化。

原理:

前面所叙述的快速排序算法是将>temp和<temp两个部分元素都放在索引值i所指向的位置的左边部分,而双路快速排序则是使用两个索引值(i、j)用来遍历我们的序列,将<temp的元素放在索引 i 所指向位置的左边,而将>temp的元素放在索引j所指向位置的右边。

思想:

1、首先从左边的i索引往右边遍历,如果i指向的元素<temp,那直接将i++移动到下一个位置,直道i指向的元素>=temp则停止。

2、然后使用j索引从右边开始往左边遍历,如果j指向的元素>temp,那直接将j–移动到下一个位置,直道j指向的元素<=temp则停止

3、此时i之前的元素都已经归并为<temp的部分了,而j之后的元素也都已经归并为>temp的部分了,此时只需要将vec[i]和vec[j]交换位置即可。这样就可以避免出现=temp的元素全部集中在某一个部分,这正是双路排序算法的一个核心。但是当需要排序的数据长度比较小时,此时使用插入排序的性能比较好,所以我们结合快速排序和插入排序进行一个优化快速排序。

具体实现代码:

在这里随机数产生的数据进行性能分析,如图第一个数据是未经过优化的时执行一个利用随机生成数乱序并且重复率较高的执行时间,第二个数据是二路快速排序的执行时间。在这里执行时间相差不多是因为这里我们难以得到一个重复率非常高的一组数据,但是实际上双路快速排序优化的结果还是比较理想的。

在上述优化的过程中, 对于原始的快排来说,当重复率低,并且数组的有序化低是具有很好的效率,但是在应对大量的规则性比较强的数据时,效率是跟不上。而随机快速排序只是获取了一个随机基准值来应对数据有序化程度比较高的情况下来进行优化。但是二路快速排序结合了随机快排和插入排序来应对能够出现的所有情况来 达到比较好的效果。

最新文章
格子达文章类AI高风险怎么降低
随着人工智能技术的发展,AI辅助写作工具在学术研究和论文撰写中的应用越来越广泛。然而,这也带来了一些风险,尤其是关于原创性和学术诚信的问题。本文旨在探讨如何识别和降低AI辅写带来的高风险,并提供三个成功案例分析。一、识别AI辅写
天风证券:AI应用推动SOC市场增长,智能终端需求激增
  财中社12月12日电 发布行业点评报告,报告指出2024年12月19日,火山引擎冬季FORCE原动力大会的开发者论坛将重磅开启,聚焦火山引擎在大模型开发、应用与落地方面的实践;包含从火山方舟平台背后的技术理念和原理,到豆包MarsCode、扣子
香港最准的100%肖一肖||内容分析使用落实0.421432602
香港最准的100%肖一肖分析——揭秘生肖预测的奥秘在充满神秘色彩的香港文化中,生肖预测一直备受关注,肖一肖作为生肖预测的一种形式,更是受到广大市民的追捧,本文将结合关键词“香港最准的100%肖一肖”,对肖一肖预测进行深入分析,并探
赵旭与李晴晴情感纠葛最新章节精彩阅读分享
在这个充满浪漫和波折的故事中,赵旭与李晴晴的感情经历了一系列考验。最新章节中,两人之间的情感愈发复杂,彼此的誓言和生活中的挑战交织在一起。读者在这一部分将感受到他们内心的挣扎与成长,仿佛能够身临其境,体验到那份深刻的情感。
四川省药品监督管理局 关于下属事业单位2024年下半年公开招聘工作人员笔试总成绩、岗位排名及面试资格审查公告进入阅读模式
根据《四川省药品监督管理局关于下属事业单位2024年下半年公开招聘工作人员公告》(以下简称公告)规定,现将下属事业单位2024年下半年公开招聘工作人员笔试总成绩、岗位排名及面试资格审查有关事宜公告如下。一、笔试总成绩及岗位排名情况详
商务TG:@mogushangwutv在数字化时代,拥有一个网站已经成为企业、组织或个人展示自身形象、分享信息、进行交流的重要平台,而建站程序则是实现这一目标的关键工具,本文将全面解析建站程序的相关知识,从基础到高级,帮助您更好地理解和应
随时随地看手机快速现场直播,轻松获取最新赛事资讯!手机快速现场直播
手机扫彩票二维码是一种方便快捷的购买彩票方式。确保您的手机上安装了二维码扫描应用,或直接使用手机自带的相机功能。在购买彩票时,销售点或官方网站会提供相应的彩票二维码。打开应用或相机对准二维码,系统会自动识别并弹出相关信息。
热搜排行榜前三!黑龙江哪家不孕不育医院比较正规“近期”黑龙江不孕不育咨询在线咨询
:黑龙江省中医研究院、哈尔滨医科大学附属第一医院、黑龙江省医院、哈尔滨市第二医院以及哈尔滨市生殖健康医院等。1. 黑龙江省中医研究院:该医院专注于传统中医疗法,擅长运用中药调理内分泌系统,设有妇科、男科等多个科室,能够对不孕
骁龙870机型还值不值得选?这四款实力依旧很强,或可继续战三年
当新款处理器出炉的时候,有很多老款机型的热度都在逐渐下跌,但是从性能方面来说,即使是老款处理器,依旧非常的能打,而且新机发布之后,老机型的价格也会走低,那么从性价比的角度来说,依旧有着不错的使用体验。至于拍照方面,6400万主
网站赚钱攻略,介绍网络世界的财富密码
随着互联网的飞速发展,越来越多的人投身于建设,希望通过网站实现财富增值。如何才能在众多网站中脱颖而出,实现盈利呢?本文将为您揭秘网络世界的财富密码,助您轻松赚钱。一、合理布局,提高网站权重1. 关键词研究:我们要明确自己的网
相关文章
推荐文章
发表评论
0评