算法导论 — 比较排序算法对比实验

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值