ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:19.38KB ,
资源ID:7491304      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7491304.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验四题目一排序实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验四题目一排序实验报告.docx

1、数据结构实验四题目一排序实验报告数据结构实验报告实验名称: 实验四排序学生姓名:XX班 级:班内序号:学 号: 日 期: 1实验要求实验目的:通过选择实验内容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。题目1:使用简单数组实现下面各种排序算法,并进行比较。排序算法如下:1、 插入排序;2、 希尔排序;3、 冒泡排序;4、 快速排序;5、 简单选择排序;6、 堆排序;7、 归并排序;8、 基数排序(选作);9、 其他。具体要求如下:1、 测试数据分成三类:正序、逆序、随机数据。2、 对于这三类数据,比较上述排序算法中关键字的比较次数和移动次

2、数(其中关键字交换记为3次移动)。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、插入排序关键代码:1 取排序的第二个数据与前一个比较:if(riri-1)2 若比前一个小,则赋值给哨兵:r0=ri;3 从后向前比较,将其插入在比其小的元素后:for(j=i-1;r0rj;j-)rj+1=rj;a+; rj+1=r0;4 循环排序2、希尔排序关键代码:1 将数组分成两份:d=n/22 将第一份数组的元素与哨兵比较:for(int i=d+1;i=n;i+)3 若其大与哨兵,其值赋给哨兵:if(r0

5、0&r0=1;d=d/2) 3、冒泡排序关键代码: 1 取数组元素与下一个元素比较: for(int i=1;iri+1) 2 若比下一个元素大,则与其交换: r0=ri; ri=ri+1; ri+1=r0; 3 后移,重复:for(int i=1;ibound;i+)4 改变总元素值,并重复上述代码:int bound=pos; 4、快速排序关键代码: 1 选取标准值:r0=ri2 比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比较:while(i=flag) j-;3 否则后面元素赋给前面元素:ri=rj;4 若后指针元素小于标准值,前指针后移,重新比较

6、:while(ij&ri=flag) i+;5 否则前面元素赋给后面元素:rj=ri;5、简单选择排序关键代码: 1 从数组中选择出最小元素: for(int j=i+1;j=n;j+)2 if(rjrindex) index=j; 3 若不为当前元素,则交换: if(index!=i) r0=ri; ri=rindex; rindex=r0;4 后移将当前元素设为下一个元素:for(int i=1;in;i+)6、堆排序关键代码: 1 生成小顶堆:while(j=m) if(jrj+1) j+;2 if(ri0;i-)coutri ;7、归并排序关键代码: 1 将数组每次以1/2拆分,直到为

7、最小单位: mid=(low+high)/2;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、 测试主函数流程:

8、流程图如图所示流程图示意图程序运行结果图如下:2、 测试条件:按题目要求分别输入同组数据的正序、逆序、随机序列进行测试。3、 测试结论:不同的排序方法移动次数比较次数和所用时间都是有所区别的。4. 总结调试时出现的问题及解决的方法:在调试时,开始在归并排序的时候,虽然代码编译成功,但调试出现了错误,通过逐步调试发现是由于发生了地址冲突。因此将原本的直接调用数组改成了结构体数组,通过引用来实现归并排序,最终获得了成功心得体会:学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况下一步的改进:改进计数器,寻找其他排序方式。附:源代码#includeusing names

9、pace 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); vo

10、id 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

11、;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:B

12、ubbleSort(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 = fi

13、rst ; /分区的左界 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,

14、i,j); Qsort (r,i,pivotloc -1); /左分区快速排序 Qsort (r,pivotloc +1,j); / 右分区快速排序 else void LED:SelectSort(int r,int n) /简单选择排序 compare = 0; move = 0; for(int i =1 ; i n ; i+) /n-1趟排序 int index = i; /查找最小记录的位置index for(int j = i + 1;j=n;j+) compare+; if(rjrindex) index = j; if(index != i) /若第一就是最小元素,则不用交换

15、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; else r0 = ri; ri = rj; rj = r0; i = j ; j = 2* i; void LED:HeapSort (int r,int n) for(int i =

16、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+; else r1k+ = rj+; while(i=m) r1k+ = ri+; while(j=t) r1k+ = rj+;void L

17、ED: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); else for(;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;

18、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直接插入排序乱序输出结果

19、:;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冒泡排序正序输出结果:

20、;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); coutendl;for(int i= 1;i=j;i+) Ri=r1i; cout快速排序正序输出结果:;l.Qsort(R,1,j);for(int k=1;k=j;k+)coutRk ; cout比较次数为Cnum ; 移动次数为Mnum ; Cnum =

21、0;Mnum = 0;coutendl;for(int i= 1;i=j;i+) Ri=r2i; cout快速排序逆序输出结果:;l.Qsort(R,1,j);for(int k=1;k=j;k+)coutRk ; cout比较次数为Cnum ; 移动次数为Mnum ; Cnum = 0;Mnum = 0;coutendl;for(int i= 1;i=j;i+) Ri=r3i; cout快速排序乱序输出结果:;l.Qsort(R,1,j);for(int k=1;k=j;k+)coutRk ; cout比较次数为Cnum ; 移动次数为Mnum ; coutendl;for(int i= 1;i=j;i+) Ri=r1i; cout简单选择排序正序输出结果:;l.SelectSort(R,j);coutendl;for(int i= 1;i=j;i+) Ri=r2i; cout简单选择排序逆序输出结果:;l.SelectSort(R,j);coutendl;for(int i= 1;i=j;i+) Ri=r3i; cout简单选择排序乱序输出结果:;l.SelectSort(R,j);coutendl;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1