北京邮电大学数据结构实验四排序问题(附代码含操作界面).docVIP

北京邮电大学数据结构实验四排序问题(附代码含操作界面).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北京邮电大学数据结构实验四排序问题(附代码含操作界面)

数据结构实验报告 实验名称: 实验四——排序 学生姓名: 梁国豪 班 级:2011210400 班内序号: 14 学 号:2011210400 日 期: 2012/12/12 1.实验要求 (1) 实验目的: 通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 实验内容: 使用简单数组实现下面各种排序算法,并进行比较。 (2) 实验内容: 1、插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序 7、归并排序 8、基数排序(选作) 9、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作) 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 使用一维数组存储待排序的数据。共使用两个数组,一个用来存储原始数据,一个用来存储待排序数据。每次排序完毕,用原始数据作为菜单函数的实参自身调用,保证每一次都对同一组数据排序。: a0 a1 a2 a3 a4 2.2 关键算法分析 1.关键算法 排序问题实质是使用数组存储原始无序数据,然后使用各种排序方法进行排序。 1.直接插入的改进: 在一般的直接插入中,关键码每移动一次就需要比较一次。在移动的方面,可以优化成每次用一个哨兵存储要比较的数,每次比较只要把前一个移动到后一个,遇到合适的位置就直接把哨兵存储到该位置上,其一趟整理的伪代码如下: 1.用哨兵存储要比较的数,r[0]=r[i]; 2.如果哨兵小于排序好的数,那个数就向后移一位,r[j+1]=r[j]; 3.循环直至r[0]=r[j] 4.把哨兵存储到最后比较的那个位置,r[j+1]=r[0]; 2.希尔排序: 在一般的直接插入中,关键码每移动一次就需要比较一次。在移动的方面,优化是比较困难的,因为对静态线性表的插入必然要带来大量的移动。但是,我们可以在比较上进行一些优化。在查找技术一张曾学过的“折半查找法”,在这里就可以照葫芦画瓢地运用。一趟排序的伪代码如下: 1.如果该元素小于间距为d的元素就存储在那个元素之前,r[j+d]=r[j];; 2.循环直到其大于该元素,然后把哨兵存储到该位置,r[j+d]=r[0];; 3.冒泡排序的改进 在某趟排序中,如果需要进行相邻的连续交换,可以像插入排序那样先集体右移,最后定位原始左侧的数据。一趟排序的伪代码如下: 1.对无序区元素ai自左至右循环 1.1如果该元素小于处于其右侧相邻的元素则跳过该元素; 1.2当前元素赋值给临时变量; 1.3当前元素右侧相邻元素左移; 1.4 i++; 1.5循环直到临时变量小于或等于当前元素右侧相邻元素或已达序列尾部 1.5.1当前元素右侧相邻元素左移; 1.5.2 i++; 1.6临时变量置于当前位置; 4.快速排序的非递归算法及改进 一般来说,递归算法由于传递参数和返回值的因素会影响效率,而且容易造成系统栈溢出,所以使用非递归算法会较好一些。另外,一趟排序中的轴值是始终不变的,不需要反复赋值,只需要先存入临时变量,确定位置后再写入即可。相关伪代码如下: 初始化:取第一个元素作为轴值,保存在r[0],i=1为左侧待比较元素,j=n为右侧待比较元素。 右侧扫描:从后往前找到第一个比轴值小的元素,移至位置i。 左侧扫描:从前到后找到第一个比轴值大的元素,移至位置j。 反复执行以上两个过程,直到i与j相等,判决快速排序结束,将r[0]移至r[i],该算法时间复杂度为O(nlog2n),空间复杂度O(1)。。 5:简单选择排序: 第一趟,在待排序记录r[1....n]中选出最小的记录,将它与r[1]交换。 第二趟,在待排序记录r[2....n]中选出最小的记录,将它与r[2]交换。 以此类推,第i趟将待排序记录r[i....n]中选择关键码最小的记录,与r[i]交换,使有序序列不断增长直到全部排序完成。 6:堆排序: 筛选过程:总是将根结点与左右孩子进行比较,若不满足堆的条件,则将根结点与较小的结点交换,一直到叶子结点,或所有子树均为堆为止。 堆的建立:从最后一个分支结点开始逐个向上筛选,直到根结点结束,这样从最后一个子树开始使其符合堆的性质,迭代地使整个树符合堆的性质。若堆序列的长度为n,则最后一个分支结点的编号为[n/2]。 堆排序:根据堆的性质,堆的根结点总是堆中的最小元素,所以将根结点逐个输出

文档评论(0)

juhui05 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档