




免费预览已结束,剩余9页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构实验报告实验名称: 实验四排序学生姓名:XX班 级:班内序号:学 号: 日 期: 1实验要求实验目的:通过选择实验内容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。题目1:使用简单数组实现下面各种排序算法,并进行比较。排序算法如下:1、 插入排序;2、 希尔排序;3、 冒泡排序;4、 快速排序;5、 简单选择排序;6、 堆排序;7、 归并排序;8、 基数排序(选作);9、 其他。具体要求如下:1、 测试数据分成三类:正序、逆序、随机数据。2、 对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为3次移动)。3、 对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。4、 对2和3的结果进行分析,验证上述各种算法的时间复杂度。5、 编写main()函数测试各种排序算法的正确性。2. 程序分析2.1 存储结构存储结构:数组0A11A22A33A44A55A6NAn-12.2 关键算法分析一、关键算法:1、插入排序a、 取排序的第二个数据与前一个比较b、 若比前一个小,则赋值给哨兵c、 从后向前比较,将其插入在比其小的元素后d、 循环排序2、希尔排序a、 将数组分成两份b、 将第一份数组的元素与哨兵比较c、 若其大与哨兵,其值赋给哨兵d、 哨兵与第二份数组元素比较,将较大的值赋给第二份数组e、 循环进行数组拆分3、对数据进行编码a、 取数组元素与下一个元素比较b、 若比下一个元素大,则与其交换c、 后移,重复d、 改变总元素值,并重复上述代码4、快速排序a、 选取标准值b、 比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比较c、 否则后面元素赋给前面元素d、 若后指针元素小于标准值,前指针后移,重新比较e、 否则前面元素赋给后面元素5、简单选择排序a、 从数组中选择出最小元素b、 若不为当前元素,则交换c、 后移将当前元素设为下一个元素6、堆排序a、 生成小顶堆b、 将堆的根节点移至数组的最后c、 去掉已做过根节点的元素继续生成小顶堆d、 数组倒置7、归并排序a、 将数组每次以1/2拆分,直到为最小单位b、 小相邻单位数组比较重排合成新的单位c、 循环直至完成排序二、代码详细分析:1、插入排序关键代码: 取排序的第二个数据与前一个比较:if(riri-1) 若比前一个小,则赋值给哨兵:r0=ri; 从后向前比较,将其插入在比其小的元素后:for(j=i-1;r0rj;j-)rj+1=rj;a+; rj+1=r0; 循环排序2、希尔排序关键代码: 将数组分成两份:d=n/2 将第一份数组的元素与哨兵比较:for(int i=d+1;i=n;i+) 若其大与哨兵,其值赋给哨兵:if(r00&r0=1;d=d/2) 3、冒泡排序关键代码: 取数组元素与下一个元素比较: for(int i=1;iri+1) 若比下一个元素大,则与其交换: r0=ri; ri=ri+1; ri+1=r0; 后移,重复:for(int i=1;ibound;i+) 改变总元素值,并重复上述代码:int bound=pos; 4、快速排序关键代码: 选取标准值:r0=ri 比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比较:while(i=flag) j-; 否则后面元素赋给前面元素:ri=rj; 若后指针元素小于标准值,前指针后移,重新比较:while(ij&ri=flag) i+; 否则前面元素赋给后面元素:rj=ri;5、简单选择排序关键代码: 从数组中选择出最小元素: for(int j=i+1;j=n;j+) if(rjrindex) index=j; 若不为当前元素,则交换: if(index!=i) r0=ri; ri=rindex; rindex=r0; 后移将当前元素设为下一个元素:for(int i=1;in;i+)6、堆排序关键代码: 生成小顶堆:while(j=m) if(jrj+1) j+; if(ri0;i-)coutri ;7、归并排序关键代码: 将数组每次以1/2拆分,直到为最小单位: mid=(low+high)/2; 小相邻单位数组比较重排合成新的单位: while(i=m&j=high) if(L.ri=L.rj) tk+=L.ri+; else tk+=L.rj+; while(i=m) tk+=L.ri+; while(j=high) tk+=L.rj+; for(i=low,k=0;i=high;i+,k+) L.ri=tk; 三、计算关键算法的时间、空间复杂度插入排序O(n2)希尔排序O(n2)冒泡排序O(n2)快速排序O(nlog2n)简单选择排序O(n2)堆排序O(nlog2n)归并排序O(nlog2n)3. 程序运行结果1、 测试主函数流程:流程图如图所示流程图示意图程序运行结果图如下:2、 测试条件:按题目要求分别输入同组数据的正序、逆序、随机序列进行测试。3、 测试结论:不同的排序方法移动次数比较次数和所用时间都是有所区别的。4. 总结调试时出现的问题及解决的方法:在调试时,开始在归并排序的时候,虽然代码编译成功,但调试出现了错误,通过逐步调试发现是由于发生了地址冲突。因此将原本的直接调用数组改成了结构体数组,通过引用来实现归并排序,最终获得了成功心得体会:学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况下一步的改进:改进计数器,寻找其他排序方式。附:源代码#includeusing namespace std; int Cnum = 0; int Mnum = 0;class LEDprivate :int compare;int move;public:void InsertSort(int r , int n) ;/直接插入排序void ShellInsert(int r,int n) ;/希尔排序void BubbleSort(int r,int n);/冒泡排序void Qsort(int r,int i,int j);/快速排序void SelectSort(int r,int n);/选择排序void HeapSort (int r,int n);void MergePass(int r,int r1,int n ,int h);int Partion(int r ,int first ,int end );void Sift(int r,int k , int m);void Merge(int r,int r1,int s,int m,int t);void LED:InsertSort(int r , int n) /插入排序 compare = 0;move = 0;for(int i=2;i=n;i+) if(riri-1) r0=ri; move +; ri=ri-1;move +; int j; for(j=i-2;r0rj;j-) compare+; rj+1=rj; move +; +compare; rj+1=r0;move +; +compare;for(int i=1;i=n;i+)coutri ;cout比较次数为compare ; 移动次数为move=1;d=d/2) for(int i=d+1;i=n;i+) if(ri0&r0rj;j=j-d)rj+d=rj;move+;compare+; rj+d=r0;move+;compare+;for(int i=1;i=n;i+) coutri ;cout比较次数为compare ; 移动次数为move ;void LED:BubbleSort(int r,int n) /冒泡排序改进compare = 0;move = 0;int pos = n ;while(pos != 0)int bound = pos;pos = 0;for(int i =1;i ri+1)r0 = ri; ri = ri+1;ri+1 = r0; /交换pos = i;move=move+3;for(int i=1;i=n;i+)coutri ;cout比较次数为compare ; 移动次数为move ;int LED:Partion(int r ,int first ,int end )int i = first ; /分区的左界int j = end; /分区的右界int pivot = ri; /保存第一个元素,作为基准元素while(i j)while(i=pivot) /右侧扫描,寻找pivot的元素前移j - ;Cnum+;ri = rj ;while(ij)&(ripivot的元素后移i +;Cnum+;rj = ri;ri = pivot ; /将轴值移动到i=j的位置return i; /返回分区的分界值ivoid LED:Qsort(int r,int i,int j)if(i j) Mnum +;int pivotloc = Partion(r,i,j);Qsort (r,i,pivotloc -1); /左分区快速排序Qsort (r,pivotloc +1,j); / 右分区快速排序elsevoid LED:SelectSort(int r,int n) /简单选择排序compare = 0;move = 0;for(int i =1 ; i n ; i+) /n-1趟排序int index = i; /查找最小记录的位置indexfor(int j = i + 1;j=n;j+)compare+;if(rjrindex)index = j;if(index != i) /若第一就是最小元素,则不用交换r0 = ri;ri = rindex;rindex = r0; /利用r0,作为临时空间交换记录move+=3;for(int i=1;i=n;i+)coutri ;cout比较次数为compare ; 移动次数为move ;/*void LED:Sift(int r,int k , int m)int i = k, j = 2*i;while(j=m)if(jm&rj=rj)break;elser0 = ri;ri = rj;rj = r0;i = j ; j = 2* i;void LED:HeapSort (int r,int n)for(int i = n/2; i = 1 ; i-) /建堆Sift(r,i,n);for(int i = n;i1;i-) /堆排序r0 = r1; r1 = ri;ri= r0; /输出堆顶元素Sift(r,1,i-1); /重建堆void LED:Merge(int r,int r1,int s,int m,int t)int i=s;int j = m + 1;int k = s ;while(i=m&j=t)if(rirj)r1k+ = ri+;elser1k+ = rj+;while(i=m)r1k+ = ri+;while(j=t)r1k+ = rj+;void LED:MergePass(int r,int r1,int n ,int h)int i = 1;while(i=n-2*h+1)Merge (r ,r1,i,i+h-1,i+2*h-1);i+= 2*h;if(in-h+1)Merge (r,r1,i,i+h-1,n);elsefor(;i=n;i+)r1i = ri;*/void main()int r110000,r210000,r310000;int R10000;char y ;int j=0;cout请输入元素个数:j;cout请输入将要排序的元素(正序):endl;for(int i=1;ir1i;cout请输入将要排序的元素(逆序):endl;for(int i=1;ir2i;cout请输入将要排序的元素(乱序):endl;for(int i=1;ir3i;coutendl;LED l;for(int i= 1;i=j;i+)Ri=r1i;cout直接插入排序正序输出结果:;l.InsertSort(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r2i;cout直接插入排序逆序输出结果:;l.InsertSort(R,j); coutendl;for(int i= 1;i=j;i+)Ri=r3i;cout直接插入排序乱序输出结果:;l.InsertSort(R,j);coutendl; for(int i= 1;i=j;i+)Ri=r1i;cout希尔排序正序输出结果:;l.ShellInsert(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r2i;cout希尔排序逆序输出结果:;l.ShellInsert(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r3i;cout希尔排序乱序输出结果:;l.ShellInsert(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r1i;cout冒泡排序正序输出结果:;l.BubbleSort(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r2i;cout冒泡排序逆序输出结果:;l.BubbleSort(R,j);coutendl;for(int i= 1;i=j;i+)Ri=r3i;cout冒泡排序乱序输出结果:;l.BubbleSort(R,j);co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州省凯里学院第十三届贵州人才博览会引才28人模拟试卷参考答案详解
- 2025年合肥市第一人民医院招聘若干人考前自测高频考点模拟试题及答案详解(历年真题)
- 2025昆明辅仁技工学校教师招聘(55人)模拟试卷及完整答案详解
- 2025年度中国农业科学院哈尔滨兽医研究所公开招聘18人模拟试卷及答案详解参考
- 2025年延安东辰中学教师招聘模拟试卷完整参考答案详解
- 2025江西都市城际公交有限公司招聘2名劳务派遣人员模拟试卷及参考答案详解
- 小学夏季安全培训会课件
- Grapiprant-Standard-生命科学试剂-MCE
- Gly-7-MAD-MDCPT-hydrochloride-生命科学试剂-MCE
- 2025江苏盐城市滨海城发投资控股集团有限公司招聘考前自测高频考点模拟试题及答案详解(新)
- 室内装饰装修施工工艺标准规范及管理流程
- 【拓展阅读】类文阅读《燧人氏钻木取火》
- 李建涛员工从“老板”做起课件
- 儿童认知发展
- 海船船员甲类三管轮实习记录簿
- 注采压力分布规律研究课件
- 填料及表面处理培训课件
- 4初步设计评审报告
- 文学理论(全套课件)
- 法院民事调解协议书
- 2022年人口变动情况抽样调查表
评论
0/150
提交评论