《算法导论》这本书介绍了5种比较排序算法:插入排序、冒泡排序、归并排序、堆排序、快速排序。我们现在通过实验来对比这5种排序算法的运行时间。用随机数发生器生成不同长度的数组,将每种算法应用于不同长度的数组,统计程序的运行时间,从而得得每种算法的期望运行时间随输入规模的变化曲线。
  1. 全部5种算法对比
  如下图所示,横坐标是输入规模(数组长度),纵坐标是运行时间(单位:μsμsμs)。其中,一骑绝尘的绿色曲线对应的是冒泡排序,书上说冒泡排序是一种很低效的算法,实验结果确实如此。
  红色曲线对应的是插入排序,它比绿色曲线增长要慢。虽然插入排序的期望时间复杂度与冒泡排序一样,都为Θ(n2)Θ(n^2)Θ(n2),但是实验结果显示,插入排序的期望性能还是要优于冒泡排序。
  剩下3条曲线增长要慢多了,它们分别对应的是归并排序、堆排序和快速排序,三者的期望时间复杂度都为Θ(nlgn)Θ(n{\rm lg}n)Θ(nlgn)。在下文有三者的详细对比。
  
  2. 归并排序、堆排序和快速排序对比
  下图只显示了归并排序、堆排序和快速排序3种期望时间复杂度都为Θ(nlgn)Θ(n{\rm lg}n)Θ(nlgn)的算法的运行时间。三者中,快速排序的优势很明显。归并排序和堆排序性能相对接近,归并排序略有优势。
  
  3. 快速排序改进
  插入排序由于实现简单,在输入规模较小时,插入排序相比其他算法还是有优势的。下图可以印证这一点。可以看到,两条曲线大约在横坐标为50的地方相交。如果输入规模小于50,插入排序更有优势。而如果输入规模大于50,快速排序更有优势。
  
  根据以上分析,我们可以改进快速排序算法:在快速排序递归过程中,如果子数组规模小于50,就不继续递归了,而是直接采用插入排序算法;而如果子数组规模大于50,继续递归过程。当然,这里设置的阈值50,只是在笔者的平台上的实验结果,并不能说在其他平台也适用。对于不同的平台,都需要做实验来确定这个阈值。下图显示了改进的快速排序算法与标准快速排序算法的运行时间。可以看到,这样的改进是有效果的。
  
  以下链接是实验用的程序。最好在Linux平台上跑,用g++编译。程序用clock_t来统计算法运行时间,在windows平台上时间精度只能到msmsms,在Linux平台上可以到μsμsμs。
  https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Others/ComparisonSort

算法导论 — 比较排序算法对比实验相关推荐

  1. 算法导论之排序算法(1)

    排序问题数据结构(引入):在实际中,待排序的数很少是单独的数值,它们通常是成为记录的数据集的一部分.每个记录包含一个关键字,就是排序问题中要重排的值.记录的剩余部分由卫星数据组成,通常与关键字是一同存 ...

  2. 数据结构之排序算法:内部排序算法的应用与比较

    排序算法:内部排序算法的应用与比较 思维导图: 比较: 应用: 思维导图: 比较: 应用:

  3. 冒泡排序算法和选择排序算法比较

      冒泡排序算法详细内容见→冒泡排序算法.   选择排序算法详细内容见→选择排序算法.   冒泡排序算法和选择排序算法的区别: 冒泡排序是比较相邻位置的两个数:而选择排序是按顺序比较,找出最大值或者最 ...

  4. 算法基础:排序算法之冒泡排序

    算法基础:排序算法之冒泡排序 实现:数列有序排序 思想:已知一个数列,令数列中相邻的两个元素一一做比较,按照小大的顺序(或从大到小的顺序),如果前一个数比后一个数大(或后一个数比前一个数大),则互换( ...

  5. 排序算法——十大排序算法总结与对比

    一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...

  6. 算法导论——计数排序

    2019独角兽企业重金招聘Python工程师标准>>> /*** 计数排序* * 不用比较的排序算法,时间可以突破O(NlgN)* * 时间复杂度O(N),稳定* * 适用于所有需要 ...

  7. 算法导论之排序和顺序统计学

    排序:对N个数的序列重排过程.待排序的数,一般是选择记录中数据集的关键字key作为排序的值,而数据集中其他数据(称为:卫星数据)以key为中心移动.实际上,对于排序过程中,key的移动和交换,卫星数据 ...

  8. 【每日算法】桶排序算法

    1)算法简介 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序 ...

  9. java排序算法总结_排序算法总结及Java实现

    1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...

最新文章

  1. 让老鼠迷上玩《毁灭战士2》?这个匈牙利神经科学家做到了
  2. 996.icu 不加班的程序员有前途吗?
  3. 【408预推免复习】计算机组成原理之控制单元的功能和控制单元的设计
  4. 线程安全的map_ThreadLocal | 线程本地存储
  5. 【AWSL】之Linux引导过程及服务控制(MBR、GRUB、runlevel、systemcl、init、ntsysv、chkconfig)
  6. Qt5.12下载和安装教程(图文详解,简单易上手)
  7. ELK——Logstash 2.2 mutate 插件【翻译+实践】
  8. Unity —Spine动画
  9. 晶振-电路中的心脏起搏器
  10. 今日分享:几个好用的文字转语音软件,来看看吧
  11. 高性能服务器架构拓扑图,某数据中心架构拓扑图.ppt
  12. 中班科学计算机,中班科学活动《蜗牛吃什么》
  13. PHP图片尺寸调整(全填充,没有黑底)
  14. 最强计算机游戏,这可能是市面上体积最小性能最强的游戏主机了
  15. 谈一谈|Word文档图片的提取
  16. irobot擦地机器人故障_Irobot Braava380t擦地机器人 操作使用说明
  17. flex 居中并两端对齐
  18. 驱动以SN码获取流程定制Barcode属性
  19. MG动画实例——星星图标
  20. https下不加www的强制跳转

热门文章

  1. Component series.line not exists. Load it first.
  2. 前端实现从视频中抽离出音频
  3. 【HarmonyOS】鸿蒙3.0使用WebView进行链接跳转,告警“hwbr_engine_AwContentsClient: Denied starting an intent without a
  4. 《RHCE考试必看》
  5. unity+google cardboard
  6. [知识点整理]中科院/国科大 网络与系统安全 期末考试知识点整理
  7. 探究from表单的身份证号码的校验逻辑 javascript
  8. 3.3 构建神经网络小结
  9. 中青报X牛客 “百校百企”青年就业扶持计划在京启动,共商青年就业蓝图
  10. java时间日期获得0点0分0秒(本地时间(时区)),获取当天零点零分时间(本地时间(时区))