网站大量收购独家精品文档,联系QQ:2885784924

几种排序的验报告.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本科学生综合性实验报告 数据结构课程设计 学 号 0103917 姓 名 朱墨 专 业 软件工程 班 级 软件103 实验项目名称 排序算法分析 指导教师 涂 保 东 开课学期 2011 至 2012 学年 第二 学期 实验设计方案 实验名称:排序算法分析 实验时间:3月10~3月14日 实验场地:寝室 软件环境:vs2010 实验任务与目的(简单介绍实验内容,说明实验任务和目的) 实现四种排序 分析这四种排序的时间复杂度 ————————————————————————————————————— 2、实验思路(详细描述解决问题的整体思路、涉及的算法思想及数据结构等) (1)快速排序: 可以通过栈来实现,使用栈来存储排序数组的两端的下标,用来实现递归的效果。 在快排的功能函数中定义一个储存数据的数组,一个栈,一个整形变量用来储存站定 的位置。通过使用构造函数来初始化,给待排序数组赋值。最关键的一部分是 quickSort()函数,在解释这个函数之前我就先解释一下我快排的思路。实现快排主 要使用的是一个分治的策略。将一个数组分为两部分,在中间有一个轴,要使得左边 的数全部小于这个值,右边的数全部大于这个值,这就是分的部分。治就是在说把左 右两边的数组再次 以相同的方式分出一共四段。由此下去直到某个数组中只剩下一 个或两、三个成员为止,之所以两、三个成员也行,是因为如果只有两个,那么这两 个一定是已经拍好了序的,因为左边必定小于中间的,右边的必定大于中间的,这是 比较重要的一次剪枝(可以加快1、2毫秒), 而分治的方法我的和书上的有所不同,在一个数组中把第一个当作是枢轴,定义一个整形i记录第一个数的下标(从这个下标开始到其左边的直到枢轴的数都是小于等于枢轴的,包括枢轴,再定义一个整形j初始值为i+1,表示从这个值开始到数组尾都是未知是小于还是大于枢轴的。才分值得过程中,每次都把i+1的值和枢轴比较大小,如果大于枢轴,j自加1;反之交换i+1和j,并同时自加i和j。最把分出的两段数组的头和尾分别入栈。 下面来分析一下快排的时间复杂度,先来看一下需要分治的次数,假设数组的长度为16,那么,第一次分为8+8,第二次分为4+4+4+4,第三次2+2+2+2+2+2+2+2,第四次为 1+1+1+1+1+1+1+1+1+1+1+1+1+1;那么大致就是log216,所以分治次数为log2N,每一次分治 要进行N次处理,那么平均时间复杂度为N*log2N,然后在考虑剪枝的情况,若只要分成长度 小于3的时候就停下来那么只需要两次就行,也就是说只要N*[(log2N)-2]次即可。 做一次50000个数字的快排大概是12ms,可以说快速排序是一种比较优化的排序。 (1)堆排序: 堆排序分为两个步骤,1、构造大(小)顶堆;2、不断的修改和交换构造大(小)顶堆。首先来介绍一下我的构造堆的部分,大顶堆说白了就是一棵二叉树,这棵树满足的条件就是:对于每一个节点来说,他的每一个个孩子都必须小于自己。那么我构造这棵树的方法就是,从第MAXN/2个节点开始搜索看其是否大于两个儿子(从MAXN/2开始就是一次剪枝,因为第MAXN/2+1个儿子是不可能会有子节点的),如果大于分析前MAXN/2-1个,反之把所有儿子中偏大的一个和自己交换,然后重新从第MAXN/2个开始,直到进行到根节点不用交换为止。到此一个大顶堆就算建立完成了。现在就是第二部分,交换和重建建堆的过程,首先一直一个大顶堆的树根一定是最大的,那么把树根和最后一个一个节点交换,最后一个叶子节点就是做大的了,接下来就是重新构造大顶堆,既从树根开始和两个儿子比较,如果小于某个儿子,在与两个儿子中最大的交换。在以被交换的儿子为根,与其儿子比较,直到比两个儿子都大或者没儿子为止,这时数组长度减一。 完成这些操作之后,另一个大顶堆就建好了,就可进行再次的交换。下面再来分 析一下时间复杂度,先分析交换和重驻树,树的高度是log2N,若每次都从树根 到底进行构造,那么一共还要进行Nlog2N次遍历。现在再看构造初始树的部分, 一共是(n^2)/4次?(这个我不太清楚。。。)。但说可以说堆排序比快排花费时间 一定是更多的! 冒泡排序 可以说是最简单的一种排序,思路就是把最大的沉底,小的浮上来。一共进行n-1轮,每轮都是选出最大的数往后放,每个数和下个数进行比较。时间复杂度也很好分析,一共n-1轮,最后一轮1次,第一轮n-1次,(n-1+1)*(n-1)/2,约等于n^2,可以说效率非常低。 (4)插入排序 也是一种非常简单的排序,一边检索,一边构造数组,由于这题我是

文档评论(0)

cj80011 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档