算法实验报告分治法性能分析Word格式.docx
- 文档编号:20200854
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:15
- 大小:108.98KB
算法实验报告分治法性能分析Word格式.docx
《算法实验报告分治法性能分析Word格式.docx》由会员分享,可在线阅读,更多相关《算法实验报告分治法性能分析Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
intcount_move=0;
intcount_all()returncount_compare+count_move;
voidclear_count()count_compare=0;
count_move=0;
/insertsortvoidinsert_element(inta,intsize,intelement)/sizebeforeinsertioninti=0;
for(i=size-1;
i=0;
i-)count_compare+;
if(elementai)ai+1=ai;
count_move+;
elsebreak;
ai+1=element;
voidInsertSort(inta,intsize)for(inti=1;
isize;
i+)insert_element(a,i,ai);
/mergesortvoidMerge(intc,intd,intl,intm,intr)inti=l,j=m+1,k=l;
while(i=m&
j=r)count_compare+;
if(cim)for(intq=j;
q=r;
q+)dk+=cq;
elsefor(intq=i;
q=m;
voidCopy(inta,intb,intl,intr)for(inti=l;
i=r;
i+)ai=bi;
voidMergeSort(inta,intleft,intright,intsize)if(leftright)count_compare+;
inti=(right+left)/2;
intp=size;
/thisisimportant,mindthevalue!
int*b=newintp;
MergeSort(a,left,i,size);
MergeSort(a,i+1,right,size);
Merge(a,b,left,i,right);
Copy(a,b,left,right);
/quicksortvoidswap(inta,inti,intj)inttemp=ai;
ai=aj;
aj=temp;
count_move+=3;
intpartition(inta,intp,intr)inti=p,j=r+1;
intx=ap;
while(true)while(a+ix&
ix)count_compare+;
count_compare+;
if(i=j)break;
swap(a,i,j);
ap=aj;
aj=x;
returnj;
voidQuickSort(inta,intp,intr)if(pr)intq=partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
/showvoidshow_array(inta,intsize)/显示一个数组的所有元素for(inti=0;
i+)coutai;
coutendl;
/randomarrayvoidRandomArray(inta,intsize)/随机生成数组含n个元素,其元素各不相同srand(time(NULL);
for(inti=0;
i+)ai=0;
for(inti=1;
i=size;
i+)intp=rand()%size;
while(ap!
=0)p=(+p)%size;
ap=i;
show_array(a,size);
/copyarrayvoidCopyArray(inta,intb,intsize)for(inti=0;
a=newintsize;
temp_a=newintsize;
RandomArray(temp_a,size);
CopyArray(temp_a,a,size);
InsertSort(a,size);
cout插入排序比较次数为count_compareendl;
cout插入排序移动次数为count_moveendl;
cout总规模为count_all()endl;
clear_count();
MergeSort(a,0,size-1,size);
cout合并排序比较次数为count_compareendl;
cout合并排序移动次数为count_moveendl;
QuickSort(a,0,size-1);
cout快速排序比较次数为count_compareendl;
cout快速排序移动次数为count_moveendl;
system(pause);
return0;
1.3运行示例运行示例1.4数据分析数据分析(单次录入数据具有较大随机误差,只看增长趋势)(单次录入数据具有较大随机误差,只看增长趋势)问题规模(n)排序总复杂度规模(T(n)插入排序合并排序快速排序10571055020221280122303674612384094666037150139487943280326115708561004694206410642002291247182447500130133136687368100050425430309170031000043898103401968225489根据列表分析,插入算法平均复杂度为,合并算法平均复杂度为,快速排序算法平均复杂度为,但是排序算法最坏情况下复杂度仍为,为了验证这一点,取n=1000的已排好数组,快排总规模变为503497,取n=10000的已排好数组,快排总规模变为50034997。
说明快排算法对已经基本排好的数组反而耗时间更多。
2循环赛问题循环赛问题2.1问题描述问题描述设有n个运动员要进行网球循环赛。
设计一个满足下列条件的比赛日程表:
每个选手必须与其他n-1个选手各赛一次;
每个选手一天只能赛一次;
当n是偶数时,循环赛进行n-1天。
当n是奇数时,循环赛进行n天。
2.2问题分析问题分析当n=(k=1、2、3、4,,n=2、4、8、16,)时,此时问题比较简单。
按照分治的策略,可将所有参赛的选手分为两部分,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。
递归地执行这种分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单:
只要让这2个选手进行比赛就可以了。
再逐步合并子问题的解即可得到原问题的解。
推广当n为任意整数时:
当n小于或等于1时,没有比赛。
当n是偶数时,至少举行n-1轮比赛.当n是奇数时,至少举行n轮比赛,这时每轮将会有一支球队轮空。
因此应对策略如下:
(1)当n/2为偶数时,与n=情形类似,可用分治法求解。
(2)当n/2为奇数时,递归返回的轮空的比赛要作进一步处理。
可以在前n/2轮比赛中让轮空选手与下一个未参赛选手进行比赛。
2.3源程序#includeusingnamespacestd;
inta100100;
intb100;
boolodd(intn)/判断n奇偶性returnn&
1;
/n为奇数,返回1,n为偶数,返回0voidcopyodd(intn)/n/2为奇数时的合并算法intm=n/2;
im;
i+)bi=m+i;
bm+i=bi;
i+)/由左上角小块的值算出相应的左下角小块的值for(intj=0;
j=m)aij=bi;
am+ij=(bi+m)%n;
elseam+ij=aij+m;
/由左上角小块的值算出相应的右上角和右下角小块的值for(intj=1;
jm;
j+)aim+j=bi+j;
abi+jm+j=i;
voidcopy(intn)intm=n/2;
i+)for(intj=0;
j1&
odd(n/2)copyodd(n);
/n/2为奇数时elsecopy(n);
voidtourna(intn)/改进的分治赛算法if(n=1)a00=0;
return;
if(odd(n)tourna(n+1);
/n为奇数,分治tourna(n/2);
/n为偶数,分治makecopy(n);
/合并intmain()intn;
cout请输入参数队数:
n;
tourna(n);
cout参数日程表为:
endl;
in;
jn;
j+)coutaij;
2.4运行示例3最大最小值问题最大最小值问题3.1问题描述与分析问题描述与分析在含有n个不同元素的集合中同时找出它的最大和最小元素算法思想:
先相邻两个两个比较,较大的放入数组max,较小的放入数组min,然后从max数组求出最大,min数组求出最小即可。
从算法描述中可以看出,占据算法的主要执行次数的是比较过程,因此算法的复杂性主要跟比较次数相关当n是2的幂时,即对于某个正整数k,n=,有T(n)=2T(n/2)+2=2(2T(n/4)+2)+2=2*2T(n/4)+2*2+2.=+-2=3n/2-2这是最优情况,平均则比直接比较少25%3.2源程序源程序/findmaxandmin#includeusingnamespacestd;
voidMax_Min(inta,intn)intm=(n+1)/2;
intmaxm;
intminm;
intk=0,j=0;
if(n/2!
=0)maxm-1=minm-1=an-1;
i=ai+1)maxj+=ai;
mink+=ai+1;
elsemaxj+=ai+1;
mink+=ai;
im;
i+)coutmaxi=maxit;
coutmini=miniendl;
intMAX=max0;
intMIN=min0;
for(j=1;
jMAX)MAX=maxj;
if(minjMIN)MIN=minj;
coutMAX=MAX,MIN=MINendl;
intmain(void)inta=6,16,3,13,6,5,7,8,9,10,2,8,6;
intn=sizeof(a)/sizeof(a0);
Max_Min(a,n);
3.3运行示例运行示例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告 分治 性能 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)