算法分析与设计实验报告.docx
- 文档编号:27361782
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:22
- 大小:222.83KB
算法分析与设计实验报告.docx
《算法分析与设计实验报告.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
算法分析与设计实验报告
算法分析与设计
实
验
报
告
专业班级:
姓名:
学号:
指导老师:
实验一递归算法的设计与实现
•计算整数的非负整数次幂
(1)设计思路
对于34按步骤可以分析:
34=32*32
32=31*31
31=31*1
对于33按步骤可以分析:
33=32*31;
32=31*31;
31=31*1;
分析可以得到:
当xn中n为奇数时,xn=x*(xn/2)2
当xn中n为偶数的,xn=(xn/2)2;
当n/2=0;return1;
一步步进行递归返回计算,如果n位奇数,在进行一部乘以x
否则返回运算结果
(2)源程序代码
#include
usingnamespacestd;
intpower(intx,intn)
{
inty;
if(n==0)
{
y=1;
}
else
{
y=power(x,n/2);
y=y*y;
if(n%2==1)
{
y=y*x;
}
}
returny;
}
voidmain()
{
cout<<"请输入一个底数X:
";
intx;
cin>>x;
cout<<"请输入一个指数Y:
";
inty;
cin>>y;
if(y<0)
{
cout<<"你的输入有误:
请重新输入:
"< cin>>y; } intc; c=power(x,y); cout< } (3)代码运行结果 (4)时间复杂度 令n=2k,则可以得到: f(n)=g(k)=k+1=logn+1=O(logn) 2.基于递归算法的插入排序 (1)设计思路 通过主函数传来一个数组的首地址和数组的长度,然后利用递归的原理,当n=0;程序返回,执行入栈的递归程序,依次比较2个数的大小,3个数的大小等,根据比较的结果将第n个数插入适当的位置。 (2)源程序代码 #include usingnamespacestd; voidinsert(inta[],intn) { intk; intb; n=n-1; if(n>0) { insert(a,n); b=a[n]; k=n-1; while((k>=0)&&(a[k]>b)) { a[k+1]=a[k]; k=k-1; } a[k+1]=b; } } voidmain() { inta[100]; intn; cout<<"请输入数组A[]的元素个数n(1 "; cin>>n; cout<<"请输入数组A[]的元素: "; for(inti=0;i { cin>>a[i]; } insert(a,n); for(intj=0;j { cout< } cout< } (3)代码运行结果 (4)时间复杂度 f(n)=f(n-1)+n-1=f(n-2)+n-1+(n+2)=n*(n-1)/2; 算法用于递归栈的工作单元数与n为同一数量级,即时间复杂度为O(n) 实验二递归算法的实现 •自然归并算法的设计与实现 •设计思路 首先讲待排序的n个元素分成大致相同的子集合,然后分别对这两个子集进行排序最后将排好序的子集合归并成所要求的排好序的集合 •源程序代码 #include #include usingnamespacestd; #definemax10 voidMerger_Sort(inta[],intlow,inthigh) { inttemp[max]; if(low { intmid=(low+high)/2; inti=low; intj=mid+1; intl=low; Merger_Sort(a,low,mid); Merger_Sort(a,mid+1,high); while(i<=mid&&j<=high) { if(a[i] { temp[l++]=a[i++]; } else { temp[l++]=a[j++]; } } while(i<=mid) { temp[l++]=a[i++]; } while(j<=high) { temp[l++]=a[j++]; } for(i=low;i<=high;i++) { a[i]=temp[i]; } } } voidmain() { inta[max]; intn; cout<<"请输入元素个数n: "; cin>>n; cout<<"请输入"< "; for(inti=0;i { cin>>a[i]; } Merger_Sort(a,0,n-1); for(intj=0;j { cout< } cout< } (3)代码运行结果 (4)时间复杂度 自然规定排序算法的时间复杂度为: O(n). •快速排序算法的设计与实现 •设计思路 基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 •源程序代码 #include usingnamespacestd; intPartition(inta[],intp,intr) { inti=p,j=r+1,sub; intx=a[p]; while(true) { while(a[++i] while(a[--j]>x); if(i>=j)break; sub=a[i]; a[i]=a[j]; a[j]=sub; } a[p]=a[j]; a[j]=x; returnj; } voidQuickSort(inta[],intp,intr) { if(p { intq=Partition(a,p,r); QuickSort(a,p,q-1);//对左半段排序 QuickSort(a,q+1,r);//对右半段排序 } } intmain() { inta[100]; intn; cout<<"请输入数组元素个数n(0 "; cin>>n; cout<<"请输入数组元素: ";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告