算法分析与设计实验报告分治法Word文件下载.docx
- 文档编号:18524920
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:10
- 大小:139.07KB
算法分析与设计实验报告分治法Word文件下载.docx
《算法分析与设计实验报告分治法Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告分治法Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
②快速排序:
通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
③按照分治策略,将所有选手分为两组,n个选手的比赛日程就可以通过为n/2个选手设计的比赛日程表来决定。
递归的对选手进行分割,直到剩下两个选手时,比赛日程表的制定就变得异常简单。
这时只要让这两个选手进行比赛就可以了
五.算法源代码:
⑴归并排序:
源代码如下:
#include<
iostream>
usingnamespacestd;
voidmerge(intarray[],intp,intq,intr)
{inti,k;
intbegin1,end1,begin2,end2;
int*temp=newint[r-p+1];
//申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后、//的序列
//设定两个指针,最初位置分别为两个已经排序序列的起止位置
begin1=p;
end1=q;
begin2=q+1;
end2=r;
k=0;
while((begin1<
=end1)&
&
(begin2<
=end2))
{
if(array[begin1]<
array[begin2])
{
temp[k]=array[begin1];
begin1++;
}
else
temp[k]=array[begin2];
begin2++;
k++;
}
//若第一个序列有剩余,拷贝出来粘到合并序列尾
while(begin1<
=end1)
temp[k++]=array[begin1++];
//若第二个序列有剩余,拷贝出来粘到合并序列尾
while(begin2<
=end2)
temp[k++]=array[begin2++];
for(i=0;
i<
(r-p+1);
i++)//将排序好的序列拷贝回数组中
array[p+i]=temp[i];
delete[](temp);
}
voidmerge_sort(intdata[],intleft,intright)
if(left<
right)
intmid=(left+right)/2;
merge_sort(data,left,mid);
merge_sort(data,mid+1,right);
merge(data,left,mid,right);
}
}
intmain()
{
inta[8]={10,8,98,56,42,40,7,5};
merge(a,0,3,7);
merge_sort(a,0,7);
cout<
<
"
归并排序后的数组为:
endl;
intz=0;
for(z;
z<
8;
z++)
cout<
a[z]<
"
;
return0;
截图如下:
2.快速排序:
算法实验代码如下:
#include<
voidquicksort(intnumber[],intleft,intright)
inti,j,s;
if(left<
s=number[(left+right)/2];
i=left-1;
j=right+1;
while
(1)
while(number[++i]<
s);
//向右找第一个大于轴的数
while(number[--j]>
//向左找第一个小于轴的数
if(i>
=j)
break;
swap(number[i],number[j]);
quicksort(number,left,i-1);
//对左边进行递归
quicksort(number,j+1,right);
//对右边进行递归
inta[8]={1,45,48,21,35,48,1421,98};
quicksort(a,0,7);
经快速排序后的数组为:
inti=0;
for(i;
i<
i++)
a[i]<
3.循环赛日程表:
算法实验代码如下:
#defineMAXN64
/*日程表数组*/
#include<
stdio.h>
stdlib.h>
#defineMAX32
inta[MAX][MAX];
voidCopy(inttox,inttoy,intfromx,intfromy,intn)
{inti,j;
for(i=0;
i<
n;
i++)
{for(j=0;
j<
j++)
a[tox+i][toy+j]=a[fromx+i][fromy+j];
voidTable(intk,inta[][MAX])
inti,n=1<
k;
intr;
a[0][i]=i+1;
for(r=1;
r<
=1)
i+=2*r)
Copy(r,i+r,0,i,r);
Copy(r,i,0,i+r,r);
voidOut(inta[][MAX],intn)
inti,j;
printf("
%3d"
a[i][j]);
\n"
);
{inti;
for(i=0;
5;
{intlen=1<
i;
Table(i,a);
Out(a,len);
return0;
截图所示:
作业:
线性时间排序:
voidcountsort(inta[],intn)
intcount=0;
intk=0;
while(k<
n-1)
for(inti=k+1;
if(a[k]>
a[i])
count++;
if(count==0)
k++;
if(count>
0)
swap(a[k],a[count]);
count=0;
排序后为:
for(intj=0;
j<
n;
j++)
a[j]<
voidswap(int&
x,int&
y)
inttemp;
temp=x;
x=y;
y=temp;
voidmain()
intn=8;
inta[8]={100,200,50,90,150,50,20,80};
排序前为:
for(intq=0;
q<
=7;
q++)
a[q]<
countsort(a,8);
六.实验分析:
上课讲分治算法讲的透彻,上课认真听讲和下课后对算法的理解。
在编写算法代码时还是比较容易的。
我觉得主要是要把算法理解清楚。
虽然在编程过程中也遇到了一些问题。
通过上网参考一些资料和同学间的交流都得到了很好的解决。
算法真的很重要,一个好的算法可以节省很多时间和内存。
一定要好好加油,在以后的编程中也要逐步注意自己的算法是否用得合理
实验中遇到好多问题,不知道该如何设计二维数组的循环。
通过这个实验,也知道了分治在解决问题中确实很好用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告 分治
![提示](https://static.bdocx.com/images/bang_tan.gif)