}
(3)代码运行结果
(4)时间复杂度
快速排序算法在最坏的情况下的运行时间是O(n^2)。
如果选取数组中的中值元素作为划分元素,那么快速排序算法的时间复杂度应为O(nlogn)。
此时快速排序算法的递归深度接近于logn。
因此,快速排序算法的的空间复杂度应为为O(logn)
实验三贪心算法的实现
1.背包问题的设计与实现
(1)设计思路
将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f[i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。
注意f[v]有意义当且仅当存在一个前i件物品的子集,其费用总和为f[v]。
所以按照这个方程递推完毕后,最终的答案并不一定是f[N][V],而是f[N][0..V]的最大值
(2)源程序代码
#include
usingnamespacestd;
#definen3
structthing
{
floatp;
floatw;
floatv;
};
voidquick(thinga[],intb)
{
inti;
for(i=0;i{
a[i].v=a[i].p/a[i].w;
}
for(i=0;i{
for(intj=i+1;j{
if(a[i].v{
thingb;
b.v=a[i].v;
b.p=a[i].p;
b.w=a[i].w;
a[i].p=a[j].p;
a[i].v=a[j].v;
a[i].w=a[j].w;
a[j].p=b.p;
a[j].v=b.v;
a[j].w=b.w;
}
}
}
}
floatgreedy(floatM,thinga[],floatx[],intb)
{
floatm,p=0;
for(inti=0;i{
a[i].v=a[i].p/a[i].w;
x[i]=0;
}
quick(a,n);
m=M;
for(i=0;i{
if(a[i].w<=m)
{
x[i]=1;
m=m-a[i].w;
p=p+a[i].p;
}
else
{
x[i]=m/a[i].w;
p=p+x[i]*a[i].p;
break;
}
}
returnp;
}
voidmain()
{
inti;
cout<<"输入三种物品的价格:
"<thinga[n];
for(i=0;i{
cin>>a[i].p;
}
cout<<"输入三种物品的重量:
"<for(i=0;i{
cin>>a[i].w;
}
floatm=20;
floatx[n];
floatp=greedy(m,a,x,n);
cout<<"最佳解"<
}
•代码运行结果
(4)时间复杂度
背包问题算法的时间复杂度为O(n)
2.单源点最短路径问题的设计与实现
(1)设计思路
将图G中所有的顶点V分成两个顶点集合S和T。
以v为源点已经确定了最短路径的终点并入S集合中,S初始时只