分享好友 最新动态首页 最新动态分类 切换频道
11 种 内部排序算法 大PK(Java 语言实现),究竟谁最快?
2024-12-27 00:00

声明

本篇文章用到的算法代码均是本人复习完对应的算法后,用自己的思维亲手编写的,由于时间问题,没有能够参考权威、标准的 api 源码,因此本文中的所有排序算法大概率还有优化的可能,执行效率大概率还可以更快,更稳,更省空间;希望大神发现以后可以在评论区广泛讨论,毕竟社区的力量是伟大的,开源的力量是无穷的

废话不说,先看 PK 结果

从图片可以看出,如果数据量非常小,堆排序、归并排序、快速排序、桶排序、timeSort排序、计数排序的表现都是非常优异的;那么数据量非常小的情况下,我们应该选择哪种排序算法进行排序呢?笔者推荐堆排序归并排序快速排序timesort排序,以下是参考条件

  • 冒泡排序属于暴力排序,对cpu的运算负载非常大,直接忽略
  • 插入排序,希尔排序,选择排序属于低阶排序算法,在本轮测试中表现不是非常好,而且其一般用于其他排序算法的辅助性工具,所以忽略
  • 堆排序没有用到辅助性的数组,所以它占用的空间可以忽略为待排序数组的大小,测试中耗时最短对栈的依赖适中,可以接受
  • 归并排序用到了辅助性数组,所以它占用的空间可以忽略为两倍的待排序数组的大小,测试中耗时最短,对栈的依赖适中,比堆排序稍差
  • 快速排序没有用到辅助性的数组,所以它占用的空间可以忽略为待排序数组的大小,测试中耗时偏短,但对栈的依赖最高,所以递归深度最深,比堆排序稍差
  • 桶排序严格意义上说是一种策略,一种思想,且桶排序的执行效率与编码人员的综合素质息息相关,是一种下限极低,上限极高的极度自由的排序算法,用到小数据量的排序有点大材小用
  • timeSort是 jdk 官方默认排序算法,能被官方作为默认的排序算法,必然非常优秀;且它结合了归并排序和插入排序的优点
  • 基数排序用到了辅助性数组,所以它占用的空间可以忽略为两倍的待排序数组的大小,测试中耗时偏高,但空间复杂度极低,也比较优秀
  • 计数排序用到了模板性的辅助数组所以它占用的空间可以很小,也可以很大,取决于待排序数组的分布情况,但时间复杂度极低,也比较优秀,如果待排序数组的最大最小值较小,可以考虑

从图片可以看出,如果 timeSort排序,堆排序,归并排序,快速排序,基数排序可作为选择,计数排序需要开发人员判断待排序序列的取值范围再做打算

从图片可以看出,如果数据量稍微大的情况下,因此数据量稍微大的情况下 timeSort排序,堆排序,归并排序,快速排序可作为选择;至于 冒泡排序,插入排序,希尔排序,选择排序,在 十万级别数据量及以上 的情况下可以彻底放弃了,性能差距非常大;对其余排序算法做简单分析

  • 可以明显看出,基数排序算法从此刻开始,已经有点力不从心了,所以如果数据量以万为单位的话,可以基数排序算法了
  • 计数排序算法的变现也比较优秀,但是它还是老问题,需要开发人员判断待排序序列的取值范围再做打算,否则可能会太过耗费内存空间
  • 快速排序在到达 100000 这个级别(甚至更多)的时候,会明显的暴露出一个问题——对栈(递归)的依赖太高了,如果不修改参数,大概率会出现爆栈的情况,运行时,需要配置以下参数给 jvm 虚拟机
 
 

从图片可以看出,如果数据量偏大的情况下,timeSort 排序算法的表现依旧非常卓越,必然为首选;因此数据量偏大的情况下 timeSort排序,归并排序,堆排序,快速排序,桶排序可作为选择,对其余排序算法做简单分析

  • 堆排序、归并排序在百万级数据量下的表现差距还不是很明显,且实际表现都比较优秀,可以作为选择
  • 快速排序需要注意的是,从 100000 这个级别开始就会出现明显的爆栈问题,但是其综合变现还是非常优秀的,如果要使用,注意配置 jvm 参数
  • 可以明显看出,在数据量达到 百万级别甚至更多 的情况下,桶排序开始发力了,且不鸣则已,一鸣惊人
  • 计数排序算法的变现尤其优秀,但是它还是老问题,需要开发人员判断待排序序列的取值范围再做打算,否则可能会太过耗费内存空间

从图片可以看出,如果数据量较大的情况下,桶排序 算法强悍的统治力已经显现;除此之外数据量较大的情况下 timeSort排序,归并排序,快速排序,桶排序可作为选择,对其余排序算法做简单分析

  • 可以明显看出,堆排序算法从此刻开始,已经有点力不从心了,有点跟不上老对手归并排序的步伐了,所以如果数据量以 千万为单位甚至更多的话,可以忽略堆排序算法了
  • 计数排序的表现虽然十分亮眼,但是根据其特性,笔者建议,在数据量达到千万级别甚至更多的情况下,不要考虑计数排序了,否则参考模板给内存空间的压力是在太大了

从图片可以看出,如果数据量较大的情况下,桶排序 算法已经可以做到一枝独秀了;除此之外数据量较大的情况下 timeSort排序,归并排序,快速排序,桶排序可作为选择,对其余排序算法做简单分析

  • 可以明显看出,堆排序算法在此刻已经被彻底淘汰
  • 根据实战,可以得出一个结论,如果数据量以亿为单位,首选 桶排序,可以这么说,桶排序就是为大数据量排序量身定制的,在足够大的数据量下,无论是作为武林盟主(IT界被人人奉为经典的排序王者)的快速排序还是身居兵马大元帅(被 Java 和 Python 钦点为官方默认排序算法)的 TimeSort ,都在绝对实力的面前显得黯然失色

从始至终,你可以看到有两种排序算法一直处于巅峰状态,它们就是——归并排序快速排序TimeSort排序。因此,无论在何种情况下,你都可以毫不犹豫的选择归并排序快速排序TimeSort排序进行对任意目标数据的排序操作,它们绝对不会让你失望;那么他们三者,谁最强?下面进行分析

  • 归并排序不仅快,而且稳,无论数据是全部有序,还是部分有序甚至完全倒序的情况下,他都可以做到一如既往的快,这就是王者的实力!可以说是宗师般的存在,这也是 TimeSort 将归并作为主要底层排序算法的底气所在,因此说归并排序是曾经的王者,教科书般的典范自然毫不夸张
  • 快速排序在绝大多数情况下,的确要比归并排序更快,但是它有两个缺点——其一是不稳定,如果数据在大致有序甚至完全有序的情况下,快排的效率会大打折扣,可谓是一步一坑!要比归并慢很多;其二是快排对栈内存的依赖太高了,在一般的情况下,数据量达到 10万 级别,就会出现爆栈的情况,需要修改 jvm 运行参数,否则会直接奔溃
  • TimeSort 排序算法是一种混合型的排序算法,和归并,快排并不是完全一样的类型;但是从它一出生那一刻起,便注定了荣华富贵,师承天下第一的归并排序,还又使用插入排序将存在的逆序序列矫正,最后将多个有序的序列利用归并排序合并,无论在那种情况,TimeSort 都比归并排序有过之而无不及,可谓是青出于蓝而胜于蓝。因此 TimeSort 是当之无愧的天下第一

综上所述,如果说归并排序是张三丰,那么 TimeSort 就是张无忌,从对武学的修养,领悟,造诣方面讲,张无忌自然不是张三丰的对手,甚至不在一个级别,但是若真起来,张三丰也不一定能打赢张无忌,毕竟九阳神功提供强大的源源不断的内力,乾坤大挪移更是开挂般的存在,可以瞬间恢复伤势;那么 快速排序是谁?自然是 常胜宝树王,论综合实力,不敌张三丰与张无忌,但是若配合圣火令中的武功,有时候张无忌也不敌

是个人就有优缺点,同样排序算法也一样;归并排序没有缺点吗?有!归并排序需要用到额外的数组,内存空间更大,而冒泡排序不需要用到额外的内存空间;TimeSort没有缺点吗?有,数据量极大的情况下,没有桶的思想,属实更不上时代的步伐;快速排序缺点不止一个,就更不用说了。所以要想在每种情况下都想得到最快的排序结果,单独使用一种排序算法肯定做不到,得分情况而论;以下情况不一定就是最优解,需要配合各自机器的配置特点进一步分析

Ⅰ10000 及以下数据量排序算法的选择

在数据完全有序或完全倒序的情况下,TimeSort排序 的表现最为优秀

在数据部分有序的情况下,堆排序、归并排序、快速排序、计数排序、TimeSort排序 会轮流登上王者,可随意选择,但注意计数排序的特性

Ⅱ 100000 左右数据量排序算法的选择

在数据完全有序或完全倒序的情况下,TimeSort 的表现最为优秀

在数据部分有序的情况下,如果取值范围不是很大,计数排序的表现最为优秀

在数据部分有序,且确定不适合使用计数排序的情况下,堆排序、归并排序、快速排序、TimeSort排序 会轮流登上王者,可随意选择

Ⅲ 100000 左右数据量排序算法的选择

经核实,在数据完全有序或完全倒序的情况下,TimeSort 的表现最为优秀

在数据部分有序的情况下,如果取值范围不是很大,计数排序的表现最为优秀

在数据部分有序,且确定不适合使用计数排序的情况下堆排序、归并排序、快速排序、TimeSort排序 会轮流登上王者,可随意选择

Ⅳ 1000000 左右数据量排序算法的选择

在数据完全有序或完全倒序的情况下,TimeSort 的表现最为优秀

在数据部分有序的情况下,如果取值范围不是很大,计数排序的表现最为优秀

在数据部分有序,且确定不适合使用计数排序的情况下,桶排序、堆排序、归并排序、快速排序、TimeSort排序 会轮流登上王者,可随意选择

Ⅴ 10000000 及以上左右数据量排序算法的选择

在数据完全有序或完全倒序的情况下,TimeSort 的表现最为优秀

在数据部分有序情况下,桶排序一直处于巅峰,第一梯队首选桶排序,第二梯队为 TimeSort排序,第三梯队为快速排序,第四梯队为归并排序

(已设置终生免费下载,可放心下载

时间工具类

 

排序工具类

 

排序算法公用抽象类

 

冒泡排序

 

插入排序

 

希尔排序

 

选择排序

 

堆排序

 

归并排序

 

快速排序

 

桶排序

 

基数排序

 

计数排序

 

TimeSort 排序(JDK默认排序算法

 
 
 
 

各种算法的 PK 结果与代码质量、数据分布、参数配置、机器配置、机器实时可用资源等息息相关,本文仅代表当时的情境下,笔者代码质量的前提下执行的情况,不代表标准算法的科学研究与对比

最新文章
濮阳企业在线曝光度提升攻略,SEO优化与网络推广全方位策略
濮阳SEO优化网络推广方法旨在全面提升企业在线曝光度。通过关键词优化、内容营销、链接建设等多渠道策略,精准触达目标用户,提高网站排名,实现企业品牌及产品的高效推广。随着互联网的普及,越来越多的企业开始重视网络推广,尤其是,SEO
高清美女写真生成工具推荐!超简单AI绘画神器,1分钟轻松掌握!
DALL-E 2:OpenAI推出的DALL-E 2因其强大的图像生成能力而受到广泛关注。它可以根据你的文本描述生成高质量的图像,甚至可以创造原本不存在的角色和场景。它的强大之处在于生成的结果往往很具创意和艺术感,但相对来说,操作上稍显复杂,需
经济与军事的关系的名言及其在现代社会的体现,全面应用分析数据_The37.83.49
摘要:名言指出经济与军事之间存在密切关系,在现代社会中这种关系愈发显现。经济为军事提供资源和支持,军事力量则保障经济发展的安全与稳定。通过应用分析数据,我们可以看到经济数据与军事投入的相关性,以及军事技术对经济领域的推动作
短剧出海系统全端开源,付费追剧,广告解锁支持iaa广告付费模式
var _hmt = _hmt || [];(function() {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js?3877f389e858af44b729b97e5e50c214";var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBef
远光软件跌3.15%,短期趋势看,连续3日被主力资金减仓。主力没有控盘
12月17日,跌3.15%,成交额2.54亿元,换手率2.33%,总市值116.97亿元。根据AI大模型测算远光软件后市走势。短期趋势看,连续3日被主力资金减仓。主力没有控盘。中期趋势方面,上方有一定套牢筹码积压。近期筹码减仓,但减仓程度减缓。舆情
销量见证性价比 十月最佳热销手机排行榜
  对于绝大多数购机的朋友来说,最为关心的问题首先是机器怎么样,是否适合自己,其次就是这机器的价格了。机器再好价格高昂,那也只有眼巴巴看着的份,在很多时候兜里钱就直接决定着我们会去关注什么样价位的产品,在购机的过程当中甚至
茂名爱采购运营价格
百度爱采购的服务:全网优质资源。接入全网优质网站,优质在线商家和商品遍布各个行业,覆盖各大类别。爱采购依托百度强大的搜索技术,服务大量用户,利用AI技术快速处理信息,匹配需求线索,准确到达买卖双方。该平台可直接到达全网商品信
浙江东方(600120)个股分析
[{"date":"2024-05-31","value":"182","field":"0"},{"date":"2024-06-03","value":"-1960","field":"0"},{"date":"2024-06-04&q
请问广告主想要投放广告是选小红书乘风平台还是小红书聚光平台呢?
2022年08月26日陈建贵100资深效果广告开户代运营公司,小红书、B站信息流广告,达人探店种草,抖音千川,腾讯视频号等广告开户代运营日用百货销售;化妆品批发;食品销售(仅销售预包装食品);化妆品零售;新鲜水果零售;互联网销售(除销售需
相关文章
推荐文章
发表评论
0评