数据结构课程设计报告 各种排序算法性能比较

上传人:桔**** 文档编号:562376237 上传时间:2022-08-14 格式:DOCX 页数:24 大小:135.46KB
返回 下载 相关 举报
数据结构课程设计报告 各种排序算法性能比较_第1页
第1页 / 共24页
数据结构课程设计报告 各种排序算法性能比较_第2页
第2页 / 共24页
数据结构课程设计报告 各种排序算法性能比较_第3页
第3页 / 共24页
数据结构课程设计报告 各种排序算法性能比较_第4页
第4页 / 共24页
数据结构课程设计报告 各种排序算法性能比较_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《数据结构课程设计报告 各种排序算法性能比较》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 各种排序算法性能比较(24页珍藏版)》请在金锄头文库上搜索。

1、课程设计报告课程设计题目:各种排序算法性能比较学生姓名:学 号:专 业:信息管理与信息系统班 级:指导教师:2012年 06月 23日目录CONTENTS一、课程设计目的2二、课程设计题目概述2三、数据定义2四、各种排序的基本原理及时间复杂度分析3五、程序流程图6六、程序源代码6七、程序运行与测试15八、实验体会九、参考文献一、课程设计目的课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理 论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生 适应实际,实践编程的能力。二、课程设计题目概述排序的方法很多,但是就其全面性能而言,很难提出一种被认为是最好的方 法,

2、每一种方法都有各自的优缺点,适合在不同的环境下使用。如果排序中依据 的不同原则对内部排序方法进行分类,则大致可分为直接插入排序、直接选择排 序、起泡排序、Shell排序、快速排序、堆排序等六类排序算法。本实验是对直接插入排序、直接选择排序、起泡排序、Shell排序、快速排 序、堆排序这几种内部排序算法进行比较,用不同的测试数据做测试比较。比较 的指标为关键字的比较次数和关键字的移动次数。最后用图表数据汇总,以便对 这些内部排序算法进行性能分析。三、数据定义输入数据:由于大多数排序算法的时间开销主要是关键字之间的比较和记录的移动,算 法的执行时间不仅依赖于问题的规模,还取决于输入实例中数据的状态

3、。所以对 于输入数据,我们采用由用户输入记录的个数(以关键字的数目分别为 20,100, 500 为例),测试数据由随机数产生器生成。输出数据:产生的随机数分别用直接插入排序;直接选择排序;起泡排序;Shell排序; 快速排序;堆排序这些排序方法进行排序,输出关键字的比较次数和移动次数。四、各种排序的基本原理及时间复杂度分析1、直接插入排序(InsertSort)1.1、基本原理:假设待排序的n个记录RO, R1,,Rn顺序存放在数组中,直接插入法在 插入记录Ri(i=1,2,,n-1)时,记录被划分为两个区间R0,Ri-1和Ri+1,RnT, 其中,前一个子区间已经排好序,后一个子区间是当前

4、未排序的部分,将关键码 Ki与Ki-1Ki-2,,K0依次比较,找出应该插入的位置,将记录Ri插,然后 将剩下的i-1个元素按关键词大小依次插入该有序序列,没插入一个元素后依然 保持该序列有序,经过i-1趟排序后即成为有序序列。每次将一个待排序的记录, 按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插 入完成为止。1.2、时间复杂度分析:直接插入排序算法必须进行n-1趟。最好情况下,即初始序列有序,执行 n-1趟,但每一趟只比较一次,移动元素两次,总的比较次数是(n-1),移动元 素次数是2(n-1)。因此最好情况下的时间复杂度就是O(n)。最坏情况(非递增) 下,最多比

5、较i次,因此需要的比较次数是:所以,时间复杂度为O(n2)。2、直接选择排序(SelectSort)2.1、基本原理:待排序的一组数据元素中,选出最小的一个数据元素与第一个位置的数据元 素交换;然后在剩下的数据元素当中再找最小的与第二个位置的数据元素交换, 循环到只剩下最后一个数据元素为止,依次类推直到所有记录。第一趟第n个记 录中找出关键码最小的记录与第n个记录交换;第二趟,从第二个记录开始的, 2-1个记录中再选出关键码最小的记录与第二个记录交换;如此,第 i 趟,则 从第i个记录开始的n - i + l个记录中选出关键码最小的记录与第i个记录 交换,直到所有记录排好序。2.2、时间复杂度

6、分析:该算法运行时间与元素的初始排列无关。不论初始排列如何,该算法都必须 执行n-1趟,每趟执行n-i-1次关键字的比较,这样总的比较次数为:所以,简 单选择排序的最好、最坏和平均情况的时间复杂度都为O(n2)3、冒泡排序(BubbleSort3.1、基本原理在每一趟冒泡排序中,依次比较相邻的两个关键字大小,若为反序咋交换。 经过一趟起泡后,关键词大的必须移到最后。按照这种方式进行第一趟在序列 (I0In-1)中从前往后进行两个相邻元素的比较,若后者小,则交换,比 较n-1次;第一趟排序结束,最大元素被交换到In-1中,下一趟只需在子序 列(I0In-2)中进行;如果在某一趟排序中未交换元素,

7、则不再进行下一 趟排序。将被排序的记录数组J1 -n垂直排列,每个记录Ji看作是重量为 Ji.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R: 凡扫描到违反本原则的轻气泡,就使其向上飘浮。如此反复进行,直到最后任 何两个气泡都是轻者在上,重者在下为止,最后可完成。3.2、时间复杂度分析当原始数据正向有序时,冒泡排序出现最好情况。此时,只需进行一趟排序, 作n-1次关键字比较,因此最好情况下的时间复杂度是O(n)。当原始数据反向 有序时,冒泡排序出现最坏情况。此时,需进行n-1趟排序,第i趟作(n-i)次 关键字间的比较,并且需执行(n-i)次元素交换,所以,比较次数为:因此

8、最坏 情况下的时间复杂度为O()4、Shell 排序(ShellSort)4.1、基本原理Shell排序又称缩小增量排序,Shell排序法是以创建者Donald Shell的名 字命名的.Shell排序法是对相邻指定距离(称为间隔)的元素进行比较,已知到使 用当前间隔进行比较的元素都按顺序排序为止.Shell把间隔缩小一半,然后继续 处理,当间隔最终变为1,并且不再出现变化时,Shell排序也就完成了其处理过 程先取一个整数d1n,把全部记录分成d1个组,所有距离为d1倍数的记录放 在一组中,先在各组内排序;然后去d2d1重复上诉分组和排序工作;直至所取 的增量dt=1(dtdtT-d2d1)

9、,即所有记录放在同一组中进行直接插入,直 到dt=1,即所有记录放在一组中为止。4.2、时间复杂度分析希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时 候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了, 步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会 比。(n2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改 变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的 插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。所以 希尔排序是不稳定的,其时间复杂度为o()。5、快速排序(Quic

10、kSort)5.1基本原理首先我们选择一个中间值middle (程序中我们可使用数组中间值),把比 中问值小的放在其左边,比中问值大的放在其右边。由于这个排序算法较复杂, 我们先给出其进行一次排序的程序框架。在待排序的个记录中任意取一个记录 (通常取第一个记录)为区分标准,把所有小于该排序的记录移到左边,把所有 大于该排序码的记录移到右边,中级放所选记录,为一趟快速排序。然后对前后 两个子序列分别重新上述过程,直到所有记录都排好序。对任意给定的序列中某 个元素,经过一趟排序后,将原序列分割成两个子序列(R ,R,,R )和p(0)p(1)p(s-1)(R ,R ,,R),其中前一个子序列中的所

11、有元素的关键词均小于或等于p(s+1)p(s+2)p(n-1)该元素的关键词值K ,后一个子序列中元素的关键词均大于或等于K 。称该p(s)p(s)元素R为分割元素,子序列(R ,R,,R)为其低端序列,p(s)p(0)p(1)p(s-1)(R ,R ,,R )为其高端序列。很明显,以后只需对低端和高端序列分别进 p(0)p(1)p(s-1)行快速排序,直到子序列为空或只有一个元素时结束,最后得到有序序列。总之, 每趟使表的第一个元素放在适当位置,将表两分,再对子表进行同样的递归划分, 直至划分的子表长度为1。5.2、时间复杂度分析如果每一次分划操作后,左、右两个子序列的长度基本相等,则快速排

12、序的 效率最高,其最好情况时间复杂度为O(nlogn);反之,如果每次分划操作所产2 生的两个子序列,其中之一为空序列,此时,快速排序效率最低,其最坏情况时 间复杂度为O(少)。如果选择左边第一个元素为主元,则快速排序的最坏情况发 生在原始序列正向有序或反向有序时。快速排序的平均情况时间复杂度为 O(nlogn)。26、堆排序(Heapsort)6.1、基本原理堆排序思想很简单,就是每次把关键词调整为堆,取出堆顶元素与堆中最后 一个元素交换,同时令堆的大小减一,把剩余的一些元素重新调整为堆,重复此 过程,知道堆中只剩下一个元素,n个关键字序列K1,K2,K3, 称为堆,当且仅当该序列满足如下性

13、质(简称为堆性质):(1)Ki=K2i且Ki=K2i+l 或(2)Ki=K2i+l.。若将此序列所存储的向量R1-n看作是一棵 完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中非叶子 结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。根结 点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。根 结点(亦称为堆顶)的关键字是堆里所有结点关键字中的最大者,称为大根堆。注意:堆中任一子树亦是堆。以上讨论的实际上是二叉堆,类似的可以定义K叉 堆6.2 时间复杂度分析堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成, 它们均是通过调用Hea

14、pify实现的。堆排序的最坏时间复杂度为O(nlogn)。堆 排序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆 排序不适宜于记录数较少的文件。堆排序是不稳定的,算法时间复杂度O(nlogn)。五、程序流程图六、程序源代码#include#include typedef structint key; /*关键字*/RecordNode; /*排序节点的类型*/typedef structRecordNode *record;7 页脚内容int n; /*排序对象的大小*/SortObject; /*排序节点的类型*/void InsertSort(SortObject *p

15、,unsigned long *compare,unsigned long *exchange)int i,j;RecordNode temp;SortObject *pvector;if(pvector=(SortObject *)malloc(sizeof(SortObject)=NULL)printf(OverFollow!);getchar();exit(1);for(i=0;ip-n;i+)/* 复制数组*/pvector-recordi=p-recordi;pvector-n=p-n;*compare=0;*exchange=0;for(i=1;ipvector-n;i+) temp=pvector-recordi;(*exchange)+;j=i-1;while(temp.keypvector-recordj.key)&(j=0) (*compare)+;(*exchange)+

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号