排序大数据结构课程设计.docx

上传人:b****4 文档编号:4191365 上传时间:2022-11-28 格式:DOCX 页数:10 大小:984.32KB
下载 相关 举报
排序大数据结构课程设计.docx_第1页
第1页 / 共10页
排序大数据结构课程设计.docx_第2页
第2页 / 共10页
排序大数据结构课程设计.docx_第3页
第3页 / 共10页
排序大数据结构课程设计.docx_第4页
第4页 / 共10页
排序大数据结构课程设计.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

排序大数据结构课程设计.docx

《排序大数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《排序大数据结构课程设计.docx(10页珍藏版)》请在冰豆网上搜索。

排序大数据结构课程设计.docx

排序大数据结构课程设计

《数据结构》课程设计实验报告

 

题目:

排序(必做题)

姓名:

学号:

指导老师:

时间:

2015.09.03

一、设计内容和要求

设计内容:

排序算法的实现与比较

要求:

编程希望实现希尔、快速、堆排序、归并排序算法。

要求随机产生10000个数据存入数据文件,然后读数据文件,分别采用不同的排序方法进行排序,将结果存入文件中。

 

二、算法思想描述

1.希尔排序

先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。

图解:

2.快速排序

首先选一个枢轴k(即比较的基准),通过一趟排序将待排序记录分割成独立的两部分,前一部分记录的关键码均小于或等于枢轴k,后一部分记录的关键码均大于或等于枢轴k,然后分别对这两部分重复上述方法,直到整个序列有序。

经过一次划分后

枢轴k

 

再对1、2区分别再进行快速排序

3.堆排序

筛选:

假设当前要筛选结点的编号为k,堆中最后一个结点的编号为m,并且结点k的左右子树均是堆(即r[k+1]~r[m]满足堆的条件),则筛选算法用伪代码可描述为:

 

图解:

 

堆排序:

堆排序的基本思想是:

首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者即堆顶记录,然后将它从堆中移走(通常将堆顶记录和堆中最后一个记录交换),并将剩余的记录再调整成堆,这样又找出了次大的记录,以此类推,直到堆中只有一个记录为止。

(1)用大根堆排序的基本思想

①先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区

②再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key

③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。

然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。

……

直到无序区只有一个元素为止。

(2)大根堆排序算法的基本操作:

①初始化操作:

将R[1..n]构造为初始堆;

②每一趟排序的基本操作:

将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

注意:

2只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。

②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。

堆排序和直接选择排序相反:

在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止

 

图解:

4.归并排序

归并排序是一种借助“归并”进行排序的方法,其主要思想是:

将若干有序序列逐步归并,最终归并为一个有序序列。

归并是将两个或两个以上的有序序列合并成一个有序序列的过程。

基本思想:

将一个具有n个待排序记录的序列看成是n个长度为1的有序序列,然后进行两两归并,得到n/2个长度为2的有序序列,再进行两两归并,得到n/4个长度为4的有序序列,……,直至得到一个长度为n的有序序列为止。

5.性能分析

⏹由于计算机实现的排序算法,没有标准的数据交换操作,因此用交换次数作为衡量性能的标准很不准确,这里计算移动次数,即内存发生赋值操作则计数一次。

⏹即使计算了内存的拷贝操作,实际的性能仍与很多因素关联,因此,程序作了耗时测试,研究在排序表数据结构发生变化时,算法消耗的时间随之变化的规律。

⏹数据量对性能的影响:

◆为降低其他因素的影响,每组数据均按比例平均分布。

◆如:

100个数据则分布在[0,100],500个数据则分布在[0,500]。

运行结果:

希尔

快速

归并

10

30

37

50

21

50

324

262

508

220

100

764

703

1248

539

500

6386

5078

8464

3848

1000

14916

11119

18850

8723

5000

111194

74610

117722

55235

10000

260988

162968

255552

120424

15000

406723

251777

400506

189343

20000

606881

347716

550780

260829

25000

809050

474661

705064

334093

10

24

19

73

34

50

233

138

531

286

100

500

303

1183

672

500

4804

2109

7073

4488

1000

11292

4688

15076

9976

5000

84389

28571

87078

61808

10000

203186

61861

184225

133616

15000

325076

97459

284983

208616

20000

482342

134012

388429

287232

25000

659156

169596

493845

367232

 

图表表示:

 

⏹直观分析:

两张折线图可以看出,数据量在1000以内,各排序算法各方面性能都几乎一致。

数据增多至一定值时,各算法开始各自的稳定增长,但相互之间有明显差别。

1000-15000时,希尔和堆排序仍有重叠迹象,15000后,按照希尔、堆、快速、归并的顺序,可近似认为前者斜率分别是后者的2倍。

 

⏹理论性能:

移动操作时间、空间复杂度均远超过比较操作,因此,以移动次数衡量,快速排序性能最好。

综合比较、移动次数来看,仍然是快速排序性能最好,归并次之,但这仅是理论分析,实际运行时,还要考虑诸多因素,如归并排序大量的递归函数调用及数据移动操作,会占用过多的CPU及时间,极大的影响性能。

三、程序结构

四、结果与分析

当测试10000个数据时2次测试结果如下:

当测试100000个数据时5次测试结果如下,可看出快速排序是4个中相对最快的排序方法:

五、收获与体会

1.通过产生随机数文件,我掌握了生成随机数的方法,也基本掌握了文件输入输出的方法。

也通过对每个排序算法的性能(时间)分析,发现快速排序在一般情况下在四种排序中是最快的排序方法。

2.对于测试用的数据,比如用来测试的数据的个数可以设为常量,这样方便为之后的测试做修改。

 

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

当前位置:首页 > 解决方案 > 学习计划

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

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