数据结构实验八:快速排序.docxVIP

  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文档。上传文档
查看更多
数据结构实验八:快速排序

HUNANUNIVERSITY课程实验报告题 目:快速排序学生姓名 学生学号专业班级指导老师李晓鸿完 成 日 期2 0 1 5年 1月 7日一、需求分析1.程序的功能由用户输入任务件数和任务时间,使用快速排序,输出使得所有任务等待时间最小的序列。2.输入的形式本程序由用户输入任务总数以及每个任务所花时间,中间用空格或换行隔开,任务总数必须为正整数。请输入任务总数:请输入各个任务所花时间:3.输出形式在对这些任务所花时间进行快速排序后,将这些数据从小到大输出任务时间。任务所花时间的排序如下:4.测试数据1.请输入任务总数:9请输入各个任务所花时间:5 3 4 2 6 1 5 7 3任务所花时间从小到大的排序如下:123345567请输入任务总数: 10请输入各个任务所花时间:6 5 1 2 3 5 4 8 6 1 任务所花时间从小到大的排序如下:1 1 2 3 4 5 5 6 6 8请输入任务总数:6请输入各个任务所花时间:10 10 19 45 23 5 任务所花时间从小到大的排序如下:5 10 10 19 23 45请输入任务总数: 8请输入各个任务所花时间:8 7 6 5 4 3 2 1任务所花时间从小到大的排序如下: 1 2 3 4 5 6 7 8请输入任务总数: 10请输入各个任务所花时间:2 4 6 8 1 0 12 14 26 15任务所花时间从小到大的排序如下:0 1 2 4 6 8 12 14 15 26二、概要设计1.抽象数据类型将每一个元素储存在一个有序并且有限的序列中,每一个元素都有一个自己的位置,也都有一个数据类型,所以使用线性表来储存各个任务所花的时间。ADTADT alist{数据对象:定义线性表的最大储存元素maxsize; 当前储存元素数listsize;数据关系:若listsize=0,则线性表没有元素,为空;基本操作:alist(int n)//构造函数 ~alist()//析构函数 bool append(int a)//增加元素}3.算法的基本思想 设要排序的线性表中元素是A[0]……A[N-1],首先通过时间函数余作为关键数据piot,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,通过前后指针的移动,实现快速排序。再将piot值左右两边的线性表进行快速排序,直到需要快速排序的线性表只有1个元素。4.程序基本流程程序分为三个模块:输入模块:由用户读入任务总数n以及各个任务所花时间;排序模块:对这些时间进行快速排序;输出模块:输出排序后的序列。三.详细设计1.物理数据类型由于线性表长度已知,并且进行大量的交换操作,所以使用顺序表来实现。顺序表的伪代码class alist{public:int maxsize;int listsize;int* listarry;alist(int n){maxsize = n;listsize = 0;listarry = new int[maxsize];}~alist(){delete[]listarry;}bool append(int a){if (listsize == maxsize)return false;listarry[listsize++] = a;return true;}};详细设计获取piot值——partation——quicksort获取piot值:获取随机数,通过随机数获得piot值。为了防止随机数大于所有数,对随机数就行求余,对求余后的值加1(防止左边界为0,右边界为1的情况,(r+l)/2==0).int findpiot(int a, int b){srand(time(0));int n = rand() % ((a+b)/2+1);return n;}partation(划分):开始参数l.r紧挨要分割子线性表的实际边界。每一轮执行外层do循环时,l和r都将向的线性表中间移动,若在移动过程中,l遇到比piot值大的值就停止,l遇到比piot小的就停止,交换l和r所对应的值,再次移动,直到它们交叉为止。int partition(int l, int r, int pivot){do{while (listarry[++l] pivot);while ((r != 0) (listarry[--r] pivot));swap( l, r);} while (l r);swap( l, r);return l;}quicksort(快速排序):通过递归,获取piot值后,对线性表从位置i到位置j进行一次划分,通过k值获得排序后poit值所在位置,对起始位置i到k和k+1到末尾j再次快速排序。void qso

文档评论(0)

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

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

1亿VIP精品文档

相关文档