五种排序算法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 lele[l] //比x大则前面交换到后面部分

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)的倍数,但是整体上不会相差太大。与此相比,电脑等其他因素造成轻微的误差可以忽略不计。

合并排序:

相关文档
最新文档