




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、word数据结构实验报告实验名称: 实验四排序学生姓名:XX班 级:班内序号:学 号: 日 期: 1实验要求实验目的:通过选择实验内容中的两个题目之一,学习、实现、比照、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。题目1:使用简单数组实现下面各种排序算法,并进行比拟。排序算法如下:1、 插入排序;2、 希尔排序;3、 冒泡排序;4、 快速排序;5、 简单项选择择排序;6、 堆排序;7、 归并排序;8、 基数排序选作;9、 其他。具体要求如下:1、 测试数据分成三类:正序、逆序、随机数据。2、 对于这三类数据,比拟上述排序算法中关键字的比拟次数和移动次数其中关键字交换记为3次
2、移动。3、 对于这三类数据,比拟上述排序算法中不同算法的执行时间,精确到微妙。4、 对2和3的结果进行分析,验证上述各种算法的时间复杂度。5、 编写main函数测试各种排序算法的正确性。2. 程序分析2.1 存储结构存储结构:数组0A11A22A33A44A55A6NAn-12.2 关键算法分析一、关键算法:1、插入排序a、 取排序的第二个数据与前一个比拟b、 假设比前一个小,那么赋值给哨兵c、 从后向前比拟,将其插入在比其小的元素后d、 循环排序2、希尔排序a、 将数组分成两份b、 将第一份数组的元素与哨兵比拟c、 假设其大与哨兵,其值赋给哨兵d、 哨兵与第二份数组元素比拟,将较大的值赋给第
3、二份数组e、 循环进行数组拆分3、对数据进行编码a、 取数组元素与下一个元素比拟b、 假设比下一个元素大,那么与其交换c、 后移,重复d、 改变总元素值,并重复上述代码4、快速排序a、 选取标准值b、 比拟上下指针指向元素,假设指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比拟c、 否那么后面元素赋给前面元素d、 假设后指针元素小于标准值,前指针后移,重新比拟e、 否那么前面元素赋给后面元素5、简单项选择择排序a、 从数组中选择出最小元素b、 假设不为当前元素,那么交换c、 后移将当前元素设为下一个元素6、堆排序a、 生成小顶堆b、 将堆的根节点移至数组的最后c、 去掉已做过根节点
4、的元素继续生成小顶堆d、 数组倒置7、归并排序a、 将数组每次以1/2拆分,直到为最小单位b、 小相邻单位数组比拟重排合成新的单位c、 循环直至完成排序二、代码详细分析:1、插入排序关键代码: 取排序的第二个数据与前一个比拟:if(ri<ri-1) 假设比前一个小,那么赋值给哨兵:r0=ri; 从后向前比拟,将其插入在比其小的元素后:for(j=i-1;r0<rj;j-)rj+1=rj;a+; rj+1=r0; 循环排序2、希尔排序关键代码: 将数组分成两份:d=n/2 将第一份数组的元素与哨兵比拟:for(int i=d+1;i<=n;i+) 假设其大与哨兵,其值赋给哨兵:
5、if(r0<ri-d) r0=ri; 哨兵与第二份数组元素比拟,将较大的值赋给第二份数组:for(j=i-d;j>0&&r0<rj;j=j-d) rj+d=rj; 循环进行数组拆分:for(int;d>=1;d=d/2) 3、冒泡排序关键代码: 取数组元素与下一个元素比拟: for(int i=1;i<bound;i+)if(ri>ri+1) 假设比下一个元素大,那么与其交换: r0=ri; ri=ri+1; ri+1=r0; 后移,重复:for(int i=1;i<bound;i+) 改变总元素值,并重复上述代码:int bound=
6、pos; 4、快速排序关键代码: 选取标准值:r0=ri 比拟上下指针指向元素,假设指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比拟:while(i<j&&rj>=flag) j-; 否那么后面元素赋给前面元素:ri=rj; 假设后指针元素小于标准值,前指针后移,重新比拟:while(i<j&&ri<=flag) i+; 否那么前面元素赋给后面元素:rj=ri;5、简单项选择择排序关键代码: 从数组中选择出最小元素: for(int j=i+1;j<=n;j+) if(rj<rindex) index=j; 假设
7、不为当前元素,那么交换: if(index!=i) r0=ri; ri=rindex; rindex=r0; 后移将当前元素设为下一个元素:for(int i=1;i<n;i+)6、堆排序关键代码: 生成小顶堆:while(j<=m) if(j<m&&rj>rj+1) j+; if(ri<rj) break; else int x; x=ri; ri=rj; rj=x; i=j; j=2*i; 将堆的根节点移至数组的最后: x=r1; r1=rn-i+1; rn-i+1=x; 去掉已做过根节点的元素继续生成小顶堆:sift(r,1,n-i,x,y)
8、; 数组倒置输出: for(int i=n;i>0;i-)cout<<ri<<" "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+,
9、k+) L.ri=tk; 三、计算关键算法的时间、空间复杂度插入排序On2希尔排序On2冒泡排序On2快速排序Onlog2n简单项选择择排序On2堆排序Onlog2n归并排序Onlog2n3. 程序运行结果1、 测试主函数流程:流程图如下图流程图示意图程序运行结果图如下:2、 测试条件:按题目要求分别输入同组数据的正序、逆序、随机序列进行测试。3、 测试结论:不同的排序方法移动次数比拟次数和所用时间都是有所区别的。4. 总结调试时出现的问题及解决的方法:在调试时,开始在归并排序的时候,虽然代码编译成功,但调试出现了错误,通过逐步调试发现是由于发生了地址冲突。因此将原本的直接调用数组改成了结构体
10、数组,通过引用来实现归并排序,最终获得了成功心得体会:学习、实现、比照、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况下一步的改良:改良计数器,寻找其他排序方式。附:源代码#include<iostream>using 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 BubbleSo
11、rt(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
12、, int n) /插入排序 compare = 0;move = 0;for(int i=2;i<=n;i+) if(ri<ri-1) r0=ri; move +; ri=ri-1;move +; int j; for(j=i-2;r0<rj;j-) compare+; rj+1=rj; move +; +compare; rj+1=r0;move +; +compare;for(int i=1;i<=n;i+)cout<<ri<<" "cout<<"比拟次数为"<<compare
13、 <<" ; 移动次数为"<<move<<" ;"void LED:ShellInsert(int r,int n) /希尔排序compare = 0;move = 0;for(int d=n/2;d>=1;d=d/2) for(int i=d+1;i<=n;i+) if(ri<ri-d) move+; r0=ri;int j; for(j=i-d;j>0&&r0<rj;j=j-d)rj+d=rj;move+;compare+; rj+d=r0;move+;compare+
14、;for(int i=1;i<=n;i+) cout<<ri<<" "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 <b
15、ound ; i+)compare +;if(ri>ri+1)r0 = ri; ri = ri+1;ri+1 = r0; /交换pos = i;move=move+3;for(int i=1;i<=n;i+)cout<<ri<<" "cout<<"比拟次数为"<<compare <<" ; 移动次数为"<<move<<" ;"int LED:Partion(int r ,int first ,int end )int i
16、 = first ; /分区的左界int j = end; /分区的右界int pivot = ri; /保存第一个元素,作为基准元素while(i < j)while(i<j)&&(rj>=pivot) /右侧扫描,寻找<pivot的元素前移j - ;Cnum+;ri = rj ;while(i<j)&&(ri<=pivot ) /左侧扫描,寻找>pivot的元素后移i +;Cnum+;rj = ri;ri = pivot ; /将轴值移动到i=j的位置return i; /返回分区的分界值ivoid LED:Qsor
17、t(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+)c
18、ompare+;if(rj<rindex)index = j;if(index != i) /假设第一就是最小元素,那么不用交换r0 = ri;ri = rindex;rindex = r0; /利用r0,作为临时空间交换记录move+=3;for(int i=1;i<=n;i+)cout<<ri<<" "cout<<"比拟次数为"<<compare <<" ; 移动次数为"<<move<<" ;"/*void LED:
19、Sift(int r,int k , int m)int i = k, j = 2*i;while(j<=m)if(j<m&&rj<rj+1)j+;if(ri>=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;i>1;i-) /堆排序r0 = r1; r1 = ri;ri= r0; /输出堆顶元素Sift(
20、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(ri<rj)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,
21、i,i+h-1,i+2*h-1);i+= 2*h;if(i<n-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<<"请输入元素个数:"<<endl;cin>>j;cout<<"请输入将要排序的元素(正序):"<<endl;for(int i=1;i<=j;i+)cin>&
22、gt;r1i;cout<<"请输入将要排序的元素(逆序):"<<endl;for(int i=1;i<=j;i+)cin>>r2i;cout<<"请输入将要排序的元素乱序:"<<endl;for(int i=1;i<=j;i+)cin>>r3i;cout<<endl;LED l;for(int i= 1;i<=j;i+)Ri=r1i;cout<<"直接插入排序正序输出结果:"l.InsertSort(R,j);cout&l
23、t;<endl;for(int i= 1;i<=j;i+)Ri=r2i;cout<<"直接插入排序逆序输出结果:"l.InsertSort(R,j); cout<<endl;for(int i= 1;i<=j;i+)Ri=r3i;cout<<"直接插入排序乱序输出结果:"l.InsertSort(R,j);cout<<endl; for(int i= 1;i<=j;i+)Ri=r1i;cout<<"希尔排序正序输出结果:"l.ShellInsert(R
24、,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r2i;cout<<"希尔排序逆序输出结果:"l.ShellInsert(R,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r3i;cout<<"希尔排序乱序输出结果:"l.ShellInsert(R,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r1i;cout<<"冒泡排序正序输出结果:"l.BubbleS
25、ort(R,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r2i;cout<<"冒泡排序逆序输出结果:"l.BubbleSort(R,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r3i;cout<<"冒泡排序乱序输出结果:"l.BubbleSort(R,j);cout<<endl;for(int i= 1;i<=j;i+)Ri=r1i;cout<<"快速排序正序输出结果:"l.Qsort(R,1,j);for(int k=1;k<=j;k+)cout<<Rk<<" "cout<<"比拟次数为"<<Cnum <<" ; 移动次数为"<<Mnum<<" "Cnum = 0;Mnum = 0;cout<<en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黑龙江省齐齐哈尔克山县联考2025届数学七下期末监测模拟试题含解析
- 城市交通与城市规划发展趋势研究重点基础知识点
- 美术教学资源开发与利用计划
- 深度解析的VB考试试题及答案
- 企业风险评估的总结与对策计划
- 生产计划应对外部环境变化的策略
- 2024年江苏省科学技术厅下属事业单位真题
- 经验分享提升软件设计师考试成功率的试题及答案
- 2024年洛阳市中小学教师招聘笔试真题
- 学习习惯养成指导计划
- 职专汽修考试题及答案
- 中医四诊考试题及答案
- x监理管理办法
- 芯片定制合同范本
- 2025年生猪屠宰兽医卫生检疫人员考试题(附答案)
- 电子商务教师资格证提升策略试题及答案
- 2025届云南省楚雄市重点名校初三一模物理试题(海淀一模)试卷含解析
- 记叙文阅读理解解析(课件)-部编版语文五年级下册阅读理解
- 2025年行政执法证资格考试必刷经典题库及答案(共130题)
- 超星尔雅学习通《红色经典影片与近现代中国发展(首都师范大学)》2025章节测试附答案
- 装修陪跑合同协议书8篇
评论
0/150
提交评论