算法设计与分析实验源代码及运行结果.docx
《算法设计与分析实验源代码及运行结果.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验源代码及运行结果.docx(13页珍藏版)》请在冰豆网上搜索。
![算法设计与分析实验源代码及运行结果.docx](https://file1.bdocx.com/fileroot1/2023-2/25/43773b05-33da-428c-b3f3-0260a6e636dc/43773b05-33da-428c-b3f3-0260a6e636dc1.gif)
算法设计与分析实验源代码及运行结果
1.分治法二分检索源代码:
#include
usingnamespacestd;
voidSelectSort(int*pData,intCount
{
intiTemp;
intiPos;
for(inti=0;i
{
iTemp=pData[i];
iPos=i;
for(intj=i+1;j
{
if(pData[j]
{
iTemp=pData[j];
iPos=j;
}
}
pData[iPos]=pData[i];
pData[i]=iTemp;
}
}
voidmain(
{
intiCount;
cout<<"请输入要排序的个数:
"<
cin>>iCount;
intData[2000];
cout<<"请输入原始数据:
"<
for(intk=0;k
{
cout<<"Data["<
cin>>Data[k];
}
cout<<"排序之前的数据顺序为:
"<
for(intj=0;j
{
cout< ";
}
cout<
cout<<"排序之后的数据顺序为:
"<
SelectSort(Data,iCount;
for(inti=0;i
{
cout<
}
cout<
}
运行结果截图:
2.分治法排序源代码:
#include
#include
usingnamespacestd;
intdivide(int*list,intlow,inthigh
{
intpivotkey=list[low];
while(low{
while(low=pivotkeyhigh--;
list[low]=list[high];
while(lowlist[high]=list[low];
}
list[low]=pivotkey;
returnlow;
}//一次划分;
voidsort(int*list,intlow,inthigh
{
if(low{
intpivotloc=divide(list,low,high;
sort(list,low,pivotloc-1;
sort(list,pivotloc+1,high;
}
}//快速排序算法;
intmain(
{
intarry[100];
inti;
cout<<"Thearrytobesortedare:
"<
for(i=0;i<100;i++
{
arry[i]=rand(%100;
cout<
}
sort(arry,0,99;
cout<
for(i=0;i<100;i++
{
cout<
}
return0;
}
运行结果截图:
1.货郎担问题源代码:
#include
#include
#include
#defineNUM4
usingnamespacestd;
intnum=(intpow(2,NUM-1;
classsubset
{
public:
boolcontains[NUM-1];//除了开始结点外,包含哪个城市就把相应的contains设置为1;
boolis_in(inti
{
i--;
if(contains[i]returntrue;
elsereturnfalse;
}//判断第i个城市是否在子集中,如果在返回true,否则false;
};//所有节点城市的子集。
voidset_ct(subset*s,intbegin,intend,intprocess
{
if(NUM-2==process
{
s[begin].contains[process]=false;
s[end].contains[process]=true;
}
else
{
intmiddle=(end+begin/2;
inti;
for(i=begin;i<=middle;i++
s[i].contains[process]=false;
set_ct(s,begin,middle,process+1;
for(i=middle+1;i<=end;i++
s[i].contains[process]=true;
set_ct(s,middle+1,end,process+1;
}
}//用递归的方法初始化子集结点;
intcombian(inta,intb
{
if(b>=0&&a>=b
{
if(0==b||a==breturn1;
else
{
if(a-binti,result=1;
for(i=a-b+1;i<=a;i++
result*=i;
for(i=2;i<=b;i++
result/=i;
returnresult;
}
}
elsereturn-1;
}//组合数(a选b)的计算,数据合法返回正确的值,否则返回-1,
intget_h(bool*c,intn
{
inti,result=0;
for(i=0;i{
if(i!
=n&&c[i]result+=(intpow(2,NUM-2-i;
}
returnresult;
}//计算table_d表的横坐标horizontal,
intmain(
{
int**cities=newint*[NUM];//存储个城市之间的代价矩阵
int**table_d=newint*[NUM];//存储动态距离表
int**table_p=newint*[NUM];//存储动态结点选在表
subset*sbst=newsubset[num];//所有城市节点的子集。
inti,j,k,temp,horizontal;
for(i=0;i{
cities[i]=newint[NUM];
table_d[i]=newint[num];
table_p[i]=newint[num];
for(j=0;jcin>>cities[i][j];
table_d[i][0]=cities[i][0];//初始化距离表的第一列
}
/*
cities[0][0]=32767;cities[0][1]=3;cities[0][2]=6;cities[0][3]=7;
cities[1][0]=5;cities[1][1]=32767;cities[1][2]=2;cities[1][3]=3;
cities[2][0]=6;cities[2][1]=4;cities[2][2]=32767;cities[2][3]=2;
cities[3][0]=3;cities[3][1]=7;cities[3][2]=5;cities[3][3]=32767;
for(i=1;itable_d[i][0]=cities[i][0];
*/
set_ct(sbst,0,num-1,0;
for(j=1;j{
for(i=1;i{
if(!
sbst[j].contains[i-1]
{
table_d[i][j]=32767;
for(k=1;k{
if(sbst[j].contains[k-1]
{
horizontal=get_h(sbst[j].contains,k-1;//计算出此时的table_d的横坐标。
temp=cities[i][k]+table_d[k][horizontal];
if(temp{
table_d[i][j]=temp;//将最短距离存入距离表
table_p[i][j]=k;//将选择的结点存入节点表;
}
}
}//对子集中的每一个元素计算各自被选择时的距离,然后选择最少的。
}//子集j中不包含i时
}//扫描该列的每一行
}//逐列扫描;
table_d[0][num-1]=32767;
for(i=NUM-1;i>0;i--
{
horizontal=get_h(sbst[num-1].contains,i-1;
temp=cities[0][i]+table_d[i][horizontal];
if(temp{
table_d[0][num-1]=temp;
table_p[0][num-1]=i;
}
}
cout<<"Theshortestdistanceis:
"<
cout<<"Thepathis:
0->"<";
temp=table_p[0][num-1];
horizontal=get_h(sbst[num-1].contains,temp-1;
for(i=1;i{
cout<";
temp=table_p[temp][horizontal];
horizontal=get_h(sbst[horizontal].contains,temp-1;
}
cout<<0;
return0;
}
运行结果截图:
当各城市距离都相等,比如1时:
当输入课件中讨论的数据时:
当输入上述矩阵按其主对角线对换后的矩阵的数据时:
路径刚好跟上面的相反。
2.投资问题源代码:
#include
#include
usingnamespacestd;
#defineN5//工程数;
#defineA10//资金总数;
intmain(
{
int**g=newint*[N];//NXA的矩阵,存储对工程i投资j万元的利润;
int**table=newint*[N+1];//(N+1X(A+1矩阵,存入动态决策表;
int**cash=newint*[N];//NXA的矩阵,存储各工程的投资数
int*result=newint[N];//记录最终结果,用于输出;
inti,j,k,temp;
for(i=0;i{
cash[i]=newint[A];
g[i]=newint[A];
table[i]=newint[A+1];
table[i][0]=0;//table的第一列赋0;
}//给各矩阵分配空间;
table[N]=newint[A+1];
table[N][0]=0;
for(i=A;i>0;i--table[0][i]=0;//table第一行赋0;
cout<<"Theprofitofj*10000yuaninvesttoprojectiare:
"<
for(i=0;i{
for(j=0;j{
g[i][j]=rand(%5;
cout<
}
cout<
}//为了方便,随机给利润矩阵g赋值;
cout<
for(i=1;i<=N;i++//对每一列:
for(j=1;j<=A;j++//对该列的每一个元素
{
table[i][j]=table[i-1][j];
cash[i-1][j-1]=0;
for(k=1;k<=j;k++
{
temp=table[i-1][j-k]+g[i-1][k-1];//有递推关系和前面已经求出的table得出当前的。
if(temp>table[i][j]
{
table[i][j]=temp;
cash[i-1][j-1]=k;
}//记下在有j万元资金的情况下投资前i个工程的最大利润,同时记录投资工程i的资金到cash中
}
}
temp=A-1;
for(i=N-1;i>=0;i--
{
result[i]=cash[i][temp];
temp-=result[i];
}//从cash表格中得出最终结果;
cout<<"Investmenttoeachprojectare:
"<
for(i=0;icout<<"Project"<
cout<
return0;
}
运行结果截图: