2.w=Split(A,low,high)
3.QuickSort(A,low,w-1)
4.QuickSort(A,w+1,high)
5.ensif
过程procedureSplit(A[1..n],low,high)
1.i←low//初始时i指向A[low]
2.x←A[low]//处理过程中有:
A[low..i]≤x=A[low]
3.forj←low+1tohigh//j指向当前处理的元素
4.ifA[j]≤xthen//处理过程中有:
A[i+1..j]>x=A[low]
5.i←i+1
6.ifi≠jthen互换A[i]和A[j]
7.endif
8.endfor
9.iflow≠ithen互换A[low]和A[i]
10.w←i
11.returnw
用C语言实现上述算法并上机通过。
习题二(工程名为202、源程序名为202)
解最长公共子序列问题的伪代码描述如下:
算法LCSRec(递归算法)
输入:
字符串A和B,设A和B的长度分别为n和m。
输出:
A和B的最长公共子序列的长度
1.LCSRec(n,m)
过程procedureLCSRec(i,j)
1.ifi=0orj=0thenreturn0
2.else
3.ifA[i]=B[j]then
4.returnLCSRec(i-1,j-1)+1
5.else
6.returnmax(LCSRec(i,j-1),LCSRec(i-1,j))
7.endif
8.endif
用C语言实现上述算法并上机通过。
选做题:
给出最长公共子序列问题的非递归算法(动态规划法),并上机通过。
习题三(工程名为203、源程序名为203)
解背包问题的伪代码描述如下:
算法7.4Knapsack(参见Page139)
输入:
背包容量C、物品体积集合S={s1,s2,...,sn}、物品价值集合V={v1,v2,...,vn}
输出:
可装入背包物品的最大总价值
1.fori←0tonV[i,0]←0//背包容量为0
2.forj←0toCV[0,j]←0//背包未装入任何物品
3.fori←1ton
4.forj←1toC
5.ifsi>jthen//物品ui的体积si超过容量j,不装入。
6.V[i,j]←V[i-1,j]//取上一次的计算结果
7.else//物品ui的体积si不超过容量j,可装入。
8.V[i,j]←max(V[i-1,j],V[i-1,j-si]+vi)
9.endif
10.endfor
11.endfor
12.returnV[n,C]//返回最大总价值
用C语言实现上述算法并上机通过。
选做题1:
如何修改算法Knapsack,,使它只需要Θ(C)空间,其中C是背包容量。
选做题2:
给出背包问题的非递归算法,并上机通过。
㈢提交方式
首先建立个人目录,目录名为“学号姓名”,例“57053001温敬和”。
在目录“57053001温敬和”中,建立子目录2(本次实习)。
在目录“57053001温敬和\2”中,应具有如下文件:
201.cpp、201.exe、202.cpp、202.exe、203.cpp、203.exe
《算法设计与分析》上机指导3
㈠(每个)程序书写要求
//*******************************************************
//*工程名:
103.dsp*
//*程序名:
103.cpp*
//*主要功能:
自底向上合并排序法*
//*学号姓名:
57053001温敬和*
//*编制时间:
2007年7月13日*
//********************************************************
#include//#include
voidmain()//usingnamespacestd;
{//intmain()
……//{
……//……
……//return0;
}//}
㈡实习内容
习题一(工程名为301、源程序名为301)
解最短路径问题的伪代码描述如下:
算法8.1(Page147)
输入:
含权有向图G=(V,E)的邻接矩阵,约定结点1为源。
输出:
G中结点1到其它各结点的最短路径长度
1.X={1}:
Y=V-{1}:
λ[1]=0
2.fory←2ton
3.ify相邻于顶点1thenλ[y]=length[1,y]
4.elseλ[y]=∞
5.endif
6.endfor
7.forj←1ton-1//Y中共有n-1个顶点
8.设y∈Y且λ[y]为最小
9.X←X∪{y}:
Y←Y-{y}//将结点y由集合X移入集合Y
10.for每条边(y,w)
11.ifw∈Yandλ[y]+lengh[y,w]<λ[w]then
12.λ[w]←λ[y]+lengh[y,w]
13.endif
14.endfor
15.endfor
用C语言实现上述算法并上机通过。
习题二(工程名为302、源程序名为302)
解图三着色问题的伪代码描述如下:
输入:
无向图G=(V,E)
输出:
图的结点3着色向量c[1..n],0≤c[j]≤3(1≤j≤n)。
1.c[1..n]←0//c[1..n]为全局量
2.GraphColorRec
(1)
过程GraphColorRec(k)
1.forcolor←1to3
2.c[k]←color
3.ifc[1..k]为合法着色then//部分解或解
4.ifk5.GraphColorRec(k+1)//进入下一个结点
6.else//是解
7.outputc[1..n]andexit
8.endif
9.endif
10.endfor
11.c[k]=0//回溯前清0,即没有着任何颜色。
用C语言实现上述算法并上机通过。
选做题1:
给出图三着色问题的全部解。
选做题2:
给出图三着色问题的非递归算法,并上机通过。
习题三(工程名为303、源程序名为303)
解4皇后问题的伪代码描述如下:
算法4-QueenRec(递归解)
输入:
空
输出:
对应于4皇后问题的向量c[1..4](全局量)
1.c[1..4]←0
2.advanced
(1)
过程advanced(k)
1.forcol←1to4//最多只有4列
2.c[k]←col
3.ifc是解then//部分解或解
4.ifk=4then//解
5.outputcandexit
6.else//部分解
7.advanced(k+1)//移至下一行
8.endif
9.endif
10.endfor
11.c[k]←0//返回前清0(回溯)
选做题1:
给出4皇后问题的全部解。
选做题2:
给出4皇后问题的非递归算法,并上机通过。
㈢提交方式
首先建立个人目录,目录名为“学号姓名”,例“57053001温敬和”。
在目录“57053001温敬和”中,建立子目录3(本次实习)。
在目录“57053001温敬和\3”中,应具有如下文件:
301.cpp、301.exe、302.cpp、302.exe、303.cpp、303.exe