五种排序算法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告
课程名称:算法分析与复杂性理论
实验项目名称:实验一排序算法性能分析
学院:计算机与软件学院
专业:软件工程
指导教师:**
报告人:赖辉学号:班级:软工学术型实验时间:2015-10-15
实验报告提交时间:2015-11-24
教务部制
一.实验目的
1.掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理
2.掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。二.实验步骤与结果
实验总体思路:
根据实验要求,需要用while循环控制用户选择相应算法(选择通过switch实现)或者选择输入0跳出while循环,退出程序。Switch中选择相应的算法后需要通过一个for(int j=0;j<5;j++)循环更改数组大小MAX的值(MAX *= 10),从而控制输入不同问题规模的耗时。再通过一个for(int i=0;i<20;i++)循环控制20组随机数组。为了使得程序输出更加直观,部分数据后面没有输出。相应结果和过程如下所示(代码和结果如下图所示)。
各排序算法的实现及实验结果:
1、随机数产生
代码1:
srand((unsigned)time(NULL));
For i=0 to 19
randNum(MAX,array);
当问题规模较小时,生成随机函数randNum()在for循环下运行时间短,每次产生的随机数组都是一样的,将srand((unsigned)time(NULL))语句放在for循环外面,就产生了20组不同的随机数组。
图1、产生20组随机数组
2、选择排序
代码2:
for i=0 to n-2
min=i
for j= i+1 to n-1
if ele[min]>ele[j] min=j
swap(ele[i],ele[min]) //交换元素
图2、选择排序在不同数据规模下排序所消耗的时间3、冒泡排序
代码3:
for i= 0 to n-1
for j=0 to n-1-i
if a[j]>a[j+1]
swap(a[j],a[j+1]) //交换
图3、冒泡排序在不同数据规模下排序所消耗的时间
3、合并排序
代码4:
MERGE(A, p, q, r)
n1 ←q - p + 1
n2 ←r - q
create arrays L[1 ‥n1 + 1] and R[1 ‥n2 + 1]
for i ←1 to n1
do L[i] ←A[p + i - 1]
for j ←1 to n2
do R[j] ←A[q + j]
L[n1 + 1] ←∞
R[n2 + 1] ←∞
i ←1
j ←1
for k ←p to r
do if L[i] ≤R[j]
then A[k] ←L[i]
i ←i + 1
else A[k] ←R[j]
j ←j + 1
图4、合并排序在不同数据规模下排序所消耗的时间
4、快速排序
代码5:
quick(ele[0...n-1],left,right)
if l l←left r←right x←ele[l]; while l while l r-- if l ele[l]←ele[r] l++ while l ll++ if l ele[r]←ele[l] r-- ele[l]←x; quick(ele,left,l-1) // 递归调用 quick(ele,l+1,right) 图5、快速排序在不同数据规模下排序所消耗的时间5、插入排序 代码6: for i=1→n-1 if ele[i] for j= i-1 to 0 && ele[j]>temp ele[j+1]←ele[j] ele[j+1]←temp 图6、插入排序在不同数据规模下排序所消耗的时间 三.实验分析 选择排序: 图7、由图2数据整合而成的折线图 数据规模:10 100 1000 10000 100000 耗时(ms)0 0 2.05 195.25 19868.5 图形上: 形状基本符合n2(二次增长) 数据上: 我们发现当数据规模增大10倍时: 1000→10000: 195.25/2.05=95.24≈100 10000→100000:19868.5/195.25=101.75≈100 其他倍数也可得到类似的结果。 结论: 当数据规模为10和100时因为数据太小,耗时约为0。但当数据规模为1000增大到10000时,并10000到100000时,规模增大10倍耗时都增大约100倍,可以计算出,选择排序的时间复杂度为o(n2)。 冒泡排序: 图8、由图3数据整合而成的折线图 表2、冒泡排序在不同数据规模下排序所消耗的时间 数据规模:10 100 1000 10000 100000 耗时(ms)0 0.1 2 194.15 19708 图形上: 形状基本符合n2(二次增长) 数据上: 我们发现当数据规模增大10倍时: 100→1000:2/0.1=20 (误差太大) 1000→10000:194.15/2=97.075 ≈ 100 10000→100000:19708/194.15=101.5 ≈ 100 其他倍数也可得到类似的结果。 结论: 由于开始问题规模较小,产生误差较大,但随着问题规模的按10的倍数增大,耗时逐渐呈100的倍数增大,分析伪代码也可以算出该算法的时间复杂度为o(n2)。随着问题规模的增大,多种误差会逐渐累积,耗时会超过o(n2)的倍数,但是整体上不会相差太大。与此相比,电脑等其他因素造成轻微的误差可以忽略不计。 合并排序: