当前位置:文档之家› 深圳大学算法设计与分析杨煊实验一

深圳大学算法设计与分析杨煊实验一

深圳大学实验报告
课程名称:算法设计与分析
实验项目名称:排序算法性能分析
学院:
专业、班级:
指导教师:杨烜
报告人:学号:
实验报告提交时间: 2015.4.3
教务处制
一、实验目的与实验环境
实验目的:
1. 掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理
2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。

实验环境:VC++ 6.0
二、实验原理与算法描述
算法(1)选择排序 SelectSort(A[0...n-1],n)
//利用选择排序对给定的数组排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
for i<-0 to n-2 do
min<-i
for j<-i+1 to n-1 do
if A[j]<A[min]
min<-j
swap A[i] and A[min]
理论效率:C(n) ∈θ(n^2),不稳定算法
算法(2)快速排序 QuickSort(A[0...n-1],n)
//利用快速排序对给定的数组排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
if l<r
s<-Partition(A[l...r]) //s是分裂位置
Quicksort(A[l...s-1])
Quicksort(A[s+1...r])
Partition(A[l...r])
//以第一个数为中轴,对子数组进行分区
//输入:数组A[0...n-1]中的子数组A[l...r],由左右下标l和r定义 //输出:数组A[l...r]的一个分区,分裂点的未知作为函数的返回值p<-A[l]
i<-l;j<-r+1
repeat
repeat i<-i+1 until A[i]>=P
repeat j<-j-1 until A[j]<=P
swap(A[i],A[j])
until i>=j
swap (A[i],A[j]) //当i>=j撤销最后一次交换
swap (A[l],A[j])
return j
理论效率:C(n) ∈θ(nlnn),不稳定算法
算法(3)合并排序 MergeSort(A[0...n-1])
//利用合并排序对给定的数组排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
if n>1
copy A[0...⌊n/2⌋-1] to B[0...⌊n/2⌋-1]
copy A[⌊n/2⌋...n-1] to C[0...⌈n/2⌉-1]
Mergesort(B[0...⌊n/2⌋-1])
Mergesort(C[0...⌈n/2⌉-1])
Merge(B,C,A)
Merge(B[0...p-1],C[0...q-1],A[0...p+q-1]) //将两个有序数组合并为一个有序数组
//输入:两个有序数组B[0...p-1],C[0...q-1]
//输出:A[0...p+q-1]中已经有序存放了B和C中的元素
i<-0;j<-0;k<-0
while i<p and j<q do
if B[i]<=C[j]
A[k]<-B[i];i<-i+1
else
A[k]<-C[j];j<-j+1
k<-k+1
if i=p
copy C[j...q-1] to A[k...p+q-1]
else
copy B[i...p-1] to A[k...p+q-1] 理论效率:C(n)∈θ(nlogn),稳定算法
算法(4)冒泡排序 BubbleSort(A[0...n-1]) //利用冒泡排序对给定的数组排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
for i<-0 to n-2 do
for j<-0 to n-2-i do
if A[j+1]<A[j]
swap A[j] and A[j+1]
理论效率:C(n)∈θ(n^2),稳定算法
算法(5)插入排序 InsertSort(A[0...n-1],n) //利用插入排序对给定的数组排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列的数组A[0...n-1]
for k<-2 to n do
A[0]<-A[k]
j<-k-1
while (j!=0 and A[j]>A[0]) do
A[j+1]<-A[j]
j<-j-1
A[j+1]<-A[0]
理论效率:C(n)∈θ(n^2),稳定算法
三、实验代码与运行截图
实验关键代码:
1.选择排序
2.快速排序
3.合并排序
4.冒泡排序
5.插入排序
四、实验数据整理与分析
表一选择排序输入规模n与运行时间统计图
n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0020 0.1795 17.8550
表二快速排序输入规模n与运行时间统计图
n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0010 0.0020 0.0435
表三合并排序输入规模n与运行时间统计图
n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0005 0.0025 0.0260
表四冒泡排序输入规模n与运行时间统计图
n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0025 0.3550 39.8810
表五插入排序输入规模n与运行时间统计图
n 10 100 1000 10000 100000 t(Avg)/sec lim->0 lim->0 0.0005 0.0900 8.9120
图1. 选择排序时间效率与输入规模n的关系图
图2. 快速排序时间效率与输入规模n的关系图
图3. 合并排序时间效率与输入规模n的关系图
图4. 冒泡排序时间效率与输入规模n的关系图
图5. 插入排序时间效率与输入规模n的关系图
图6. 5种不同排序算法时间效率对比图
实验分析:
1.从实验结果可以看出,可以验证,当规模n趋向无穷大的时候,排序算法的效率关系为合并排序<快速排序<插入排序<选择排序<冒泡排序。

2.从实验结果可以看出,当输入规模为100000时,合并排序所需时间仅为0.026sec,而冒泡排序则大概需要40sec,合并排序的效率大概是冒泡排序的1500倍,从理论分析来看,合并排序的时间复杂度为θ(nlogn),而冒泡排序的时间复杂度为θ(n^2),当n取100000时,两者比值大约为1500,因此可以看出,理论效率与实际效率比值基本一致。

其余几种排序算法的效率比较也和此相同。

同时,这也正是合并排序和快速排序比冒泡排序和选择排序效率高这么多的原因。

3.从算法实现的角度来看,选择排序和插入排序,都必须执行n-1趟;当冒泡排序处于最坏情况下时同样需要进行n-1趟,同时冒泡排序进行第i趟排序需要做n-i次关键字的比较和交换;而选择排序每趟执行同样要n-i-1次关键字的比较;插入排序每执行一趟排序最多比较i次;因此,这三种排序算法效率相比快速排序和合并排序较慢也是意料之中的。

4.实验测试结果与理论结果存在着差距,可能是因为测试组数较少,实验所得数据较少,因此造成数据统计以及作图不准确,造成一定的误差。

5.不同计算机的硬件系统不同,不同计算机的性能不同,因此造成不同时间测试数据的微弱差距。

五、实验结论与实验总结
实验结论:5种不同的算法都能实现排序,但效率不尽相同。

从比较可以看出,当输入规模n比较小是,各个算法的优劣体现的并不明显,当规模n达到一定程度时,不同算法之间的不同效率就明显的体现出来了。

实际效率与理论效率相比,基本一致。

可以看出,其中合并排序以及快速排序的时间效率最高。

因此,选择正确的效率高的算法,能给我们的工作带来便捷。

指导教师批阅意见:
成绩评定:
指导教师签字:
年月日备注:
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

第11 页。

相关主题