收藏 分享(赏)

算法分析与复杂性理论 实验报告 基本排序.doc

上传人:tangtianxu1 文档编号:3002730 上传时间:2018-10-01 格式:DOC 页数:15 大小:304.67KB
下载 相关 举报
算法分析与复杂性理论 实验报告 基本排序.doc_第1页
第1页 / 共15页
算法分析与复杂性理论 实验报告 基本排序.doc_第2页
第2页 / 共15页
算法分析与复杂性理论 实验报告 基本排序.doc_第3页
第3页 / 共15页
算法分析与复杂性理论 实验报告 基本排序.doc_第4页
第4页 / 共15页
算法分析与复杂性理论 实验报告 基本排序.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、深 圳 大 学 实 验 报 告课程名称: 算法设计与分析 实验名称: 多种排序算法的算法实现及性能比较 学院: 计算机与软件学院 专业: 计算机科学与技术 报告人: 张健哲 学号: 2013150372 班级: 3 同组人: 无 指导教师: 李炎然 实验时间: 2015/3/252015/4/8 实验报告提交时间: 2015/4/8 教务处制一实验目的1. 掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。二实验步骤与结果实验总体思路:利用 switch 结构来选择实验所要用的排序算法,每一种排序都用相同的

2、计算运行时间的代码,不同的算法就在算法实现部分进行改动(如下代码 1 至 5 所示) 。不断的改变数据规模,每一个规模在实验时,用循环进行多次实验并作为样本记录消耗的时间。最后输出在不同排序算法下,不同的数据规模的 20 次实验样本和平均用时(如下图 1 至 5 所示) 。各排序算法的实现及实验结果:(注 1:以下代码全部为伪代码,具体代码实现请参照程序中的代码)(注 2:图中显示的时间单位均为毫秒,图中“排序所花时间”一项为平均消耗时间,平均消耗时间结果以 20 组样本计算平均值后取整得到(并非四舍五入) 。 )1、选择排序代码 1:for i=0 to n-2min=ifor j= i+1

3、 to n-1if eleminelej min=jswap(elei,elemin) /交换图 1、选择排序在不同数据规模下排序所消耗的时间2、冒泡排序代码 2:for i= 0 to n-1for j=0 to n-1-iif ajaj+1swap(aj,aj+1) /交换图 2、冒泡排序在不同数据规模下排序所消耗的时间3、合并排序代码 3:Merge(ele1.n,left,right)middle=(left+right)/2if right1eft+1Merge(ele,left,middle)Merge(ele,middle+1,right)lleft r right ileftw

4、hile lmiddle图 3、合并排序在不同数据规模下排序所消耗的时间4、快速排序代码 4:quick(ele0.n-1,left,right)if lelel /与上面相反ll+if ltempelej+1elejelej+1temp图 5、插入排序在不同数据规模下排序所消耗的时间三实验分析选择排序:图 6、由图 1 数据整合而成的折线图为了更清晰的看到排序的数据规模与排序所需时间之间的影响, 我将实验的数据规模进行了一些调整,得到的平均数据依旧是以 20 组数据样本取平均数算得 (如下表 1、图 7 所示):(由于图片占空间大且表达不直白,我将所得数据做成表格分析,下同)数据规模: 10

5、000 20000 30000 40000 50000耗时(ms) 158 634 1424 2541 3953表 1、选择排序在不同数据规模下排序所消耗的时间图 7、由表 1 数据整合而成的折线图图形上:形状基本符合 n2(二次增长)数据上:我们发现当数据规模增大两倍时: 当数据规模增大两倍时:1000020000: 158*2 2=632634 1000030000:158*3 2=142214242000040000: 634*2 2=25362541其他倍数也可得到类似的结果。结论:我们发现,由于时间复杂度是 o(n 2)并且该排序的主要操作是比较操作,当数据规模扩大n 倍时,相应的在

6、时间的消耗上会扩大 n2倍,同时我们发现,理论上乘以 n2后的数据普遍会略小于实际数据,这主要原因可能是除了比较操作之外,赋值操作也随着 n 的增加逐渐增大,并且会在时间上体现出来,此外轻微的误差可能是数据的差异造成或者电脑等其他因素造成。冒泡排序:图 8、由图 2 数据整合而成的折线图为了更清晰的看到排序的数据规模与排序所需时间之间的影响,我将实验的数据规模进行了一些调整,得到的平均数据依旧是以 20 组数据样本取平均数算得(如下表 2、图 9 所示):数据规模: 10000 20000 30000 40000 50000耗时(ms) 284 1266 2899 5213 8075表 2、冒

7、泡排序在不同数据规模下排序所消耗的时间图 9、由表 2 数据整合而成的折线图图形上:形状基本符合 n2(二次增长)数据上:我们发现当数据规模增大两倍时: 当数据规模增大两倍时:1000020000:284*2 2=11361266(误差 130) 1000030000:284*3 2=25562899(误差343)2000040000:1266*2 2=50645313(误差 149)其他倍数也可得到类似的结果。结论:我们发现,虽然时间复杂度是 o(n 2) ,但当数据规模扩大 n 倍时,并没有相应的在时间的消耗上扩大 n2倍,而是多于 n2,同时我们发现,这个误差会随着数据规模的扩大而扩大,

8、这主要原因是除了比较操作之外,赋值操作也随着 n 的增加逐渐增大,而且事实证明在数据比较极端的情况下,赋值操作已经不能忽略不计(这里的赋值操作发生在数据交换时所需要的操作) ,最糟糕的情况是每次比较就要进行三次的赋值操作,与此相比,电脑等其他因素造成轻微的误差可以忽略不计。合并排序:图 10、由图 3 数据整合而成的折线图为了更清晰的看到排序的数据规模与排序所需时间之间的影响,我将实验的数据规模进行了一些调整,得到的平均数据依旧是以 20 组数据样本取平均数算得(如下表 3、图 11 所示):数据规模: 100000 200000 300000 400000 500000耗时(ms) 24 5

9、1 76 105 132表 3、合并排序在不同数据规模下排序所消耗的时间图 11、由表 3 数据整合而成的折线图图形上:形状基本符合 n(线性增长)数据上:我们发现当数据规模增大两倍时: 当数据规模增大两倍时:1000020000: 24*2log 22=4851 1000030000:24*3log 23=72762000040000: 51*2log 222=102105其他倍数也可得到类似的结果。结论:我们发现,由于时间复杂度是 o(nlog 2n) ,当数据规模扩大 n 倍时,相应的在时间的消耗上会扩大 nlog2n 倍,同时我们发现,理论上乘以 nlog2n 后的数据普遍会略小于实际

10、数据,这主要原因快速排序需要递归调用,递归调用需要花费额外的时间,此外轻微的误差可能是数据的差异造成或者电脑等其他因素造成。快速排序:图 12、由图 4 数据整合而成的折线图为了更清晰的看到排序的数据规模与排序所需时间之间的影响,我将实验的数据规模进行了一些调整,得到的平均数据依旧是以 20 组数据样本取平均数算得(如下表 4、图 13 所示):数据规模: 100000 200000 300000 400000 500000耗时(ms) 17 36 56 76 98表 4、快速排序在不同数据规模下排序所消耗的时间图 13、由表 4 数据整合而成的折线图图形上:形状基本符合 n(线性增长)数据上

11、:我们发现当数据规模增大两倍时: 当数据规模增大两倍时:1000020000: 17*2log 22=3436 1000030000:17*3log 23562000040000: 26*2log 22=5456其他倍数也可得到类似的结果。结论:我们发现,由于时间复杂度是 o(nlog 2n) ,当数据规模扩大 n 倍时,相应的在时间的消耗上会扩大 nlog2n 倍,同时我们发现,理论上乘以 nlog2n 后的数据普遍会略小于实际数据,这主要原因快速排序需要递归调用,递归调用需要花费额外的时间,此外轻微的误差可能是数据的差异造成或者电脑等其他因素造成。插入排序:图 14、由图 5 数据整合而成

12、的折线图为了更清晰的看到排序的数据规模与排序所需时间之间的影响,我将实验的数据规模进行了一些调整,得到的平均数据依旧是以 20 组数据样本取平均数算得(如下表 5、图 15 所示):数据规模: 10000 20000 30000 40000 50000耗时(ms) 80 319 723 1283 2011表 5、插入排序在不同数据规模下排序所消耗的时间图 15、由表 5 数据整合而成的折线图图形上:形状基本符合 n2(二次增长)数据上:我们发现当数据规模增大两倍时: 当数据规模增大两倍时:1000020000: 80*2 2=320319 1000030000:80*3 2=720723200

13、0040000: 319*2 2=12761283其他倍数也可得到类似的结果。结论:我们发现,由于时间复杂度是 o(n 2) ,当数据规模扩大 n 倍时,相应的在时间的消耗上会扩大 n2倍,理论上,如果数据太具有特殊性,那此算法被影响的程度会比较大,他的的比较次数可以从线性次数,到 n2次,赋值次数也可能由常数次变成 n2总的来说,受数据影响较大,由于我实验基数少,所以无法得出此结论。将五种排序的实验汇总在一起,如下图 16 所示图 16、由图 6、8、10、12、14 整合而来从图中以及之前的分析中我们可以得到以下结论时间复杂度同样为 o(n 2)的选择、冒泡和合并排序,在数据处理上相差的也

14、比较大,其中 1、冒泡排序平均耗时最多,其主要原因是:冒泡排序在比较次数上达到了 o(n 2) ,但这种排序同时也受交换次数的影响,而且最多时间复杂度也是 o(n 2) 。如此,同样是o(n 2) ,但冒泡排序的二次项系数会比另外两个大不少,所以最为耗时。 2、选择排序和插入排序相比较,插入排序更快,其原因是:选择排序需要从序列中找到当前最大或最小的值才能进行排序,因此每次都需要与子序列中的全部元素进行比较。而插入排序无需比较子序列全部元素,只需要找到当前序列第一个比自己大或小的元素,将自身插入到其前一个位置即可。3、同样是 o(nlog 2n)但快速排序更快:快速排序出现最差的情况并不是由于

15、输入数据,而是选取到的随机数本身,选到极端的情况非常小,所以对于绝大部分数据而言都是能达 o(nlog 2n) ,而合并排序需要赋值的语句还是较多,受输入数据的影响比快排大,所以当数据规模较大时,不受输入数据影响的快速排序更快四实验心得本次实验虽然花费很大的心思,但确实让我对这几种排序的认识更加深刻,同样的数据,排序的时间可以相差如此之大,这可能会改变我每次都使用冒泡排序的这一习惯,同时,对算法的优良性不同而导致的结果差异之大,感觉到好的算法是多么的重要,当然合理利用算法也是不可忽视的。这次实验虽然花了很大精力,却收获累累。指导教师批阅意见:成绩评定:指导教师签字:年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。2、教师批改学生实验报告时间应在学生提交实验报告时间后 10 日内。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报