北邮数据结构实验四.docx
《北邮数据结构实验四.docx》由会员分享,可在线阅读,更多相关《北邮数据结构实验四.docx(15页珍藏版)》请在冰豆网上搜索。
北邮数据结构实验四
数据结构实验报告
实验名称:
实验四排序——题目一
学生姓名:
班级:
班内序号:
学号:
日期:
2012年12月15日
1.实验要求
使用简单数组实现下面各种排序算法,并进行比较。
排序算法:
1、插入排序
2、希尔排序
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序(选作)
7、归并排序(选作)
8、基数排序(选作)
9、其他
要求:
1、测试数据分成三类:
正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
编写测试main()函数测试线性表的正确性。
2.程序分析
首先,题目要求测试不同的数据,所以可以手动输入待排序元素。
其次,由于对一组数据要求用不同的排序算法来处理,所以需要一个复制函数把排序前的无序数组寄存出去,为下一次排序做准备。
再次,由于每次排序后都需要把排序后的结果打印出来,代码是一样的,根据相同的代码可以封装成一个函数的思想,所以还需增加一个打印函数。
最后,由于题目中要求计算代码的执行时间精确到微妙级,而c++库函数中的clock()函数等只能精确到毫秒级,故需调用微软公司在其多媒体Windows中提供了精确定时器的底层API支持,本实验中调用queryperformancefrequency和queryperformancecounter函数即可满足精确到微妙级的要求。
2.1存储结构
本程序采用简单数组来储存输入的待排序数组。
2.2关键算法分析
2.2.1插入排序算法
插入排序的思想是:
每次从无序区取一元素将其添加到有序区中。
C++描述如下,其中形参r[]为待排序数组,n为待排序元素个数
2.2.2希尔排序算法
希尔排序是一种缩小增量排序的算法,首先将待排序元素集按照一定间隔分成多个子集,分别对这些子集进行直接插入排序,整个序列部分有序。
然后缩小间隔,在进行直接插入排序,直到间隔为1,此时,整个序列已全部有序。
其c++描述如下:
2.2.3冒泡排序
冒泡排序的思想是:
两两比较相邻的元素,如果反序,则交换次序,直到没有反序的元素为止。
在此思想指导下①首先将待排序元素划分为有序区和无序区,初始状态有序区为空,无序区所有待排序素;
②对无序区从前向后依次将相邻元素关键码进行比较,若反序,则交换
③重复执行②直到无序区中没有元素。
2.2.4快速排序算法
2,2,4,1一趟快速排序算法自然语言描述如下
1选取区间第一个元素作为轴值
2读取区间首尾坐标,并将其左右侧待比较元素
3右侧扫描:
从后向前找到第一个比轴值小的元素,和左侧待比较元素交换(左侧第一个带比较元素为轴值)
4左侧扫描:
从前向后找到第一个比轴值大的元素,和右侧待比较元素交换
5重复②③,直到左右两侧带比较元素的坐标相等
其c++描述如下
2.2.4.2完整的快速排序算法如下:
2.2.5选择排序算法
选择排序自然语言描述如下:
1在r[1]~r[n]待排序元素序列中选出最小记录,将其与第一个元素r[n]交换
2在r[2]~r[n]待排序元素序列中选出最小记录,将其与第一个元素r[i]交换
…………
3直至r[n-1]~r[n]
C++描述如下:
2.2.6堆排序
2.2.6.1堆的建立,按照大根堆的定义建立堆的算法如下
说明:
根节点存放在r[1]中,r[i]的左孩子为r[2*i],右孩子为r[2*i+1]
2.2.6.2调整数组为升序排列
①输出堆顶元素
②将堆中最后一个元素移至堆顶,并将剩余元素调整为大根堆
③反复执行①②两个元素,直到堆中只有一个元素
2.2.6.2堆排序完整算法如下
2.2.7二路归并排序
2.2.7.1将归并排序中待归并的两个相邻序列归并的算法
说明:
相邻序列分别为r[s]~r[m]和r[m+1]~r[t]
2.2.7.2一趟归并排序
①若子序列的个数为偶数,则将最后一个子序列与前一个子序列合并;
②若子序列的个数为奇数,则将最后一个子序列直接作为新子序列
2.2.7.3完整的二路归并算法
2.3主函数调用示例
2.3.1包含排序函数的头文件及调用windows底层API中对时间操作函数
2.3.2主函数调用代码
3.程序运行结果
3.1测试主函数流程:
流程图如图2所示
图2流程图示意图
3.2测试结果
3.2.1逆序序列
3.2.2正序序列
3.2.3随机序列
测试统计结果分析:
排序法
平均时间
最差情形
稳定度
额外空间
备注
冒泡排序
O(n2)
O(n2)
稳定
O
(1)
n小时较好
选择排序
O(n2)
O(n2)
不稳定
O
(1)
n小时较好
插入排序
O(n2)
O(n2)
稳定
O
(1)
大部分已排序时较好
希尔排序
O(nlogn)
O(ns)1<2
不稳定
O
(1)
s是所选分组
快速排序
O(nlogn)
O(n2)
不稳定
O(nlogn)
n大时较好
归并排序
O(nlogn)
O(nlogn)
稳定
O
(1)
n大时较好
堆排序
O(nlogn)
O(nlogn)
不稳定
O
(1)
n大时较好
…………………………………………………………
4.总结
…………………………