算法实验报告完美版文档格式.docx
- 文档编号:15154285
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:16
- 大小:180.83KB
算法实验报告完美版文档格式.docx
《算法实验报告完美版文档格式.docx》由会员分享,可在线阅读,更多相关《算法实验报告完美版文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
right=mid-1;
else
left=mid;
}
if(x==a[left])
returnleft;
}
return-1;
}
voidInput()
inta[30],n,i,j,x;
printf("
输入数组长度n:
"
);
scanf("
%d"
&
n);
输入有序数组:
\n\n"
for(i=0;
i<
n;
i++)
printf("
a[%d]:
i);
scanf("
a[i]);
输入要查询的数字:
x);
j=Research(a,x,n);
if(j>
=0)
%d在数组中的下标为%d!
x,j);
else
没找到!
main()
Input();
运行结果
图一
图二
实验心得:
本次实验让我了解了二分搜索法的基本思想,同时我们应该注意二分搜索法必须是在有序的元素中进行,不能在无序的元素中使用。
快速排序:
iostream>
usingnamespacestd;
#defineMAXSIZE100
intPartition(intq[MAXSIZE],intlow,inthight);
voidQsort(intq[],intlow,inthight);
intmain()
intq[MAXSIZE];
//存储数列的数组
q[0]=0;
intn=0;
cout<
<
请输入需要排序的数的个数:
;
cin>
>
\n请输入需要排序的数:
\n"
for(inti=1;
=n;
i++)//用循环方式输入数列
cin>
q[i];
Qsort(q,1,n);
//调用Partition()函数
\n排序后结果为:
for(i=1;
i++)//循环输出结果
cout<
q[i]<
"
endl;
return0;
intPartition(intq[MAXSIZE],intlow,inthigh)//对数列及数列部分划分成高低两个部分
intpivotkey;
//用于标记q[low]这个关键数
q[0]=q[low];
//q[0]用于存储q[low]这个数,q[low]空出
pivotkey=q[low];
while(low<
high)//判断长度是否大于1
while(low<
high&
q[high]>
=pivotkey)
high--;
q[low]=q[high];
//当pivotkey的值大于q[high],将q[high]放入q[low]中,q[high]空出
q[low]<
low++;
q[high]=q[low];
//当pivotkey的值小于q[low],将q[low]放入q[high]中,q[low]空出
q[low]=q[0];
//将q[0]中存储的数放入它合适的位置
returnlow;
voidQsort(intq[MAXSIZE],intlow,inthigh)
//记录关键数上一次排序后的位子
if(low<
high)
pivotkey=Partition(q,low,high);
Qsort(q,low,pivotkey-1);
//对比关键数小的数(左侧)排序
Qsort(q,pivotkey+1,high);
//对比关键数大的数(右侧)排序
运行结果:
实验总结:
在实验过程中,我只考虑了对数进行排序,没有其他的指针,所以就直接用了int型的数组。
在将数组分块排序中,我用了递归的思想,提高了程序的可读性。
实验二:
求最长公共子序列
编写程序掌握动态规划法中关于最长公共子序列的实现实验内容
三、实验内容
1、实验源代码
#include<
string.h>
voidLCSLength(intm,intn,char*x,char*y,int(*c)[20],int(*b)[20])
inti,j;
for(i=0;
i<
=m;
i++)
c[i][0]=0;
=n;
c[0][i]=0;
for(i=1;
for(j=1;
j<
j++)
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
elseif(c[i-1][j]>
=c[i][j-1])
c[i][j]=c[i-1][j];
b[i][j]=2;
c[i][j]=c[i][j-1];
b[i][j]=3;
voidLCS(inti,intj,char*x,int(*b)[20])
if(i==0||j==0)
return;
if(b[i][j]==1)
LCS(i-1,j-1,x,b);
%c"
x[i]);
elseif(b[i][j]==2)
LCS(i-1,j,x,b);
LCS(i,j-1,x,b);
charX[20],Y[20];
intb[20][20],c[20][20];
intm,n;
X[0]=Y[0]='
$'
请输入字符串X的内容:
gets(&
X[1]);
请输入字符串Y的内容:
Y[1]);
m=strlen(X+1);
n=strlen(Y+1);
字符串X的长度是%d,字符串Y的长度是%d\n"
m,n);
LCSLength(m,n,X,Y,c,b);
最长的公共子序列是:
LCS(m,n,X,b);
puts("
//cout<
通过该实验让我掌握了握动态规划算法的解题步骤,加深对动态规划算法思想的理解。
3.贪心算法实验
1、方法思想
贪心算法总是做出再当前看来最好的选择,也就是说贪心算法并不是从整体最优考虑,它所做出的选择只是在某种意义上看的局部最优选择。
2、问题描述
活动选择问题(activity-selectionproblem)即若干个具有竞争性的活动要求互斥使用某一公共资源,目标是选择最大的相容活动集合。
假定集合S={a1,a2,…,an}中含有n个希望使用某一资源的活动,这样的资源有教室、某一设备等,它们一次只能由一个活动使用。
每个活动ai有开始时间(starttime)si和完成时间(finishtime)fi,其中,0≤si<
fi<
∞。
如果某个活动ai被选中使用资源,则该活动在半开区间(si,fi]这段时间占据资源。
如果活动ai和aj在时间区间(si,fi]和(sj,fj]上不重叠,则称它们是相容的(compatible),即如果si≥fj或者sj≥fj,活动ai和aj是相容的。
活动选择问题是选择最大的相容活动集合。
3、算法描述
RECUR-ACTIVITY-SELECT(s,f,i,j)
1m←i+1
2whilem<
jandsm<
fi//找Sij中第一个活动
3dom←m+1
4ifm<
j//找到满足条件的活动m
5thenreturn{am}∪RECUR-ACTIVITY-SELECT(s,f,m,j)
//将m加入集合
6elsereturn¢
4、程序清单
iostream.h>
intrecuractivityselect(ints[],intf[],inti,intj)
intm=i+1,k=0;
while(m<
j&
s[m]<
f[i])
m=m+1;
if(m<
j)
m<
k=1+recuractivityselect(s,f,m,j);
returnk;
intbudigui(ints[],intf[],intk[],intn)
k[1]=1;
inti=1,m,t=2,w=1;
for(m=2;
m++)
if(s[m]>
=f[i])
k[t]=m;
t++;
w++;
i=m;
returnw;
inta[]={0,1,2,3,4,5,6,7,8,9,10,11};
intp[]={3,1,4,2,5,0,5,6,8,8,2,12};
intq[]={6,5,5,3,7,1,9,8,10,12,13,13};
intt[12]={0};
inti,f;
活动名称"
11;
a[i]<
活动开始时间"
p[i]<
活动结束时间"
最大相容活动序列是:
f=recuractivityselect(p,q,0,12);
安排活动个数:
f<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告 完美