北邮数据结构实验四.docx

上传人:b****5 文档编号:8372944 上传时间:2023-01-30 格式:DOCX 页数:15 大小:466.59KB
下载 相关 举报
北邮数据结构实验四.docx_第1页
第1页 / 共15页
北邮数据结构实验四.docx_第2页
第2页 / 共15页
北邮数据结构实验四.docx_第3页
第3页 / 共15页
北邮数据结构实验四.docx_第4页
第4页 / 共15页
北邮数据结构实验四.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

北邮数据结构实验四.docx

《北邮数据结构实验四.docx》由会员分享,可在线阅读,更多相关《北邮数据结构实验四.docx(15页珍藏版)》请在冰豆网上搜索。

北邮数据结构实验四.docx

北邮数据结构实验四

数据结构实验报告

实验名称:

实验四排序——题目一

学生姓名:

班级:

班内序号:

学号:

日期:

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.总结

…………………………

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

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1