实验2分治法实现归并排序.docx
- 文档编号:4187293
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:8
- 大小:95.66KB
实验2分治法实现归并排序.docx
《实验2分治法实现归并排序.docx》由会员分享,可在线阅读,更多相关《实验2分治法实现归并排序.docx(8页珍藏版)》请在冰豆网上搜索。
实验2分治法实现归并排序
实验2-分治法实现归并排序
算法分析与设计实验报告
第2次实验
姓名
学号
班级
时间
10.17上午
地点
工训楼309
实验名称
利用分治法实现归并排序算法
实验目的
通过上机实验,要求掌握分治法解决问题,以及二路归并算法的实现。
实验原理
使用分治法和二路归并算法,根据不同的随机数规模和数量,能准确的输出通过二路归并排序后的数组,并计算出程序运行所需要的时间。
实验步骤
①先输入随机数组的长度和规模;
②产生一个随机数组;
③计时开始,调用排序函数;
④输出排序后的数组,输出算法话费的时间。
关键代码
template
//将b[0]至b[right-left+1]拷贝到a[left]至a[right]
voidCopy(Ta[],Tb[],intleft,intright)
{
intsize=right-left+1;
for(inti=0;i { a[left++]=b[i]; } } //合并有序数组a[left: i],a[i+1: right]到b,得到新的有序数组b template voidMerge(Ta[],Tb[],intleft,inti,intright) { inta1cout=left,//指向第一个数组开头 a1end=i,//指向第一个数组结尾 a2cout=i+1,//指向第二个数组开头 a2end=right,//指向第二个数组结尾 bcout=0;//指向b中的元素 for(intj=0;j { if(a1cout>a1end) { b[bcout++]=a[a2cout++]; continue; } //如果第一个数组结束,拷贝第二个数组的元素到b if(a2cout>a2end) { b[bcout++]=a[a1cout++]; continue; } //如果第二个数组结束,拷贝第一个数组的元素到b if(a[a1cout] { b[bcout++]=a[a1cout++]; continue; } //如果两个数组都没结束,比较元素大小,把较小的放入b else { b[bcout++]=a[a2cout++]; continue; } } } //对数组a[left: right]进行合并排序 template voidMergeSort(Ta[],intleft,intright) { T*b=new int[right-left+1]; if(left { inti=(left+right)/2;//取中点 MergeSort(a,left,i);//左半边进行合并排序 MergeSort(a,i+1,right);//右半边进行合并排序 Merge(a,b,left,i,right);//左右合并到b中 Copy(a,b,left,right);//从b拷贝回来 } } 测试结果 实验心得 通过这次实验,我更加理解了分治法的策略和递归的调用。 明白了二路归并排序的实质办法。 可以比较在同样数据规模的情况下,不加入随机化过程和加入随机化过程的运行时间。 特别是在数据基本有序的情况下,加入随机化过程应该能大大提高速度。 计算算法运行的时间和程序运行的时间是不一样的,刚开始我把计算算法运行时间的函数start()的位置弄错了,自己不知道还是助教学长的提醒,才知道自己的错误,导致后面运行的时候得出来的时间有7,8秒了,是把我的输入的时间也算进去了,没有得到准确的算法运行时间。 改变计算时间函数的位置后,算法运行的时间才正确了。 实验得分 助教签名 附录: 完整代码 #include #include #include #include usingnamespacestd; template //将b[0]至b[right-left+1]拷贝到a[left]至a[right] voidCopy(Ta[],Tb[],intleft,intright) { intsize=right-left+1; for(inti=0;i { a[left++]=b[i]; } } //合并有序数组a[left: i],a[i+1: right]到b,得到新的有序数组b template voidMerge(Ta[],Tb[],intleft,inti,intright) { inta1cout=left,//指向第一个数组开头 a1end=i,//指向第一个数组结尾 a2cout=i+1,//指向第二个数组开头 a2end=right,//指向第二个数组结尾 bcout=0;//指向b中的元素 for(intj=0;j { if(a1cout>a1end) { b[bcout++]=a[a2cout++]; continue; } //如果第一个数组结束,拷贝第二个数组的元素到b if(a2cout>a2end) { b[bcout++]=a[a1cout++]; continue; } //如果第二个数组结束,拷贝第一个数组的元素到b if(a[a1cout] { b[bcout++]=a[a1cout++]; continue; } //如果两个数组都没结束,比较元素大小,把较小的放入b else { b[bcout++]=a[a2cout++]; continue; } } } //对数组a[left: right]进行合并排序 template voidMergeSort(Ta[],intleft,intright) { T*b=new int[right-left+1]; if(left { inti=(left+right)/2;//取中点 MergeSort(a,left,i);//左半边进行合并排序 MergeSort(a,i+1,right);//右半边进行合并排序 Merge(a,b,left,i,right);//左右合并到b中 Copy(a,b,left,right);//从b拷贝回来 } } intmain() { while (1) { intn; intf; cout<<"请输入您将要排序的数目: "; cin>>n; cout<<"请输入随机数的规模: "; cin>>f; int*a=newint[n]; cout<<"产生的随机数: "; //取随机数 srand((unsigned)time(NULL)); for(inti=0;i { a[i]=(rand()%(f)+0); cout< } //计时开始 clock_tstart,end,over; start=clock(); end=clock(); over=end-start; start=clock(); MergeSort(a,0,n-1); cout< cout<<"排序结果: "; for(intj=0;j { cout<*setw(4)*/''< } cout< end=clock(); printf("Thetimeis%6.3f",(double)(end-start-over)/CLK_TCK); system("pause"); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 分治 实现 归并 排序
![提示](https://static.bdocx.com/images/bang_tan.gif)