算法设计与分析书中程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【程序5-1】分治法
SolutionType DandC(ProblemType P)
{
ProblemType P1,P2, ,P k。
if (Small(P)) return S(P)。//子问题P足够小,用S(P)直接求解
else {
Divide(P,P1,P2, ,P k)。//将问题P分解成子问题P1, P2, …,P k Return Combine(DandC(P1),DandC(P2),…,DandC(P k))。//求解子问题,并合并解
}
}
【程序5-2】一分为二的分治法
SolutionType DandC(int left,int right)
{
if (Small(left,right)) return S(left,right)。
else {
int m=Divide(left,right)。//以m为界将问题分解成两个子问题Return Combine(DandC(left,m),DandC(m+1,right))。//分别求解子问题,并合并解
}
}
【程序5-3】可排序表类
template
struct E
{ //可排序表中元素的类型
operator K()const { return key。} //重载类型转换运算符
K key。//关键字可以比较大小
D data。//其他数据
}。
template
class SortableList
{ //可排序表类
public:
SortableList(int mSize) //构造函数
{
maxSize=mSize。
l=new T[maxSize]。
n=0。
}
~SortableList(){delete []l。}//析构函数
private:
T *l 。//动态生成一维数组
int maxSize。//线性表的最大表长
int n。//线性表的实际长度
}。
【程序5-4】求最大最小元
template
void SortableList
{
if (n==0)return。
max=min=l[0]。
for (int i=1。 i if(l[i]>max) max=l[i]。 if(l[i] } } 【程序5-5】分治法求最大、最小元 template void SortableList { //前置条件:i和j,0≤i≤j<表长,是表的下标范围的界 T min1, max1。 if (i==j) max=min=l[i]。//表中只有一个元素时 else if (i==j-1) //表中有两个元素时 if (l[i] max=l[j]。 min=l[i]。 } else { max=l[i]。 min=l[j]。 } else { //表中多于两个元素时 int m=(i+j)/2。//对半分割 MaxMin(i, m, max, min)。//求前半部子表中的最大、最小元 MaxMin(m+1, j, max1, min1)。//求后半部子表中的最大、最小元 if (max if (min>min1) min=min1。//两子表最小元的小者为原表最小元 } } 【程序5-6】二分搜索算法框架 template int SortableList { if (left<=right){ int m=Divide(left, right)。//按照某种规则求分割点m if (x else if (x>l[m]) return BSearch(x, m+1, right)。 else return m。 //搜索成功 } return -1。 //搜索失败 } 【程序5-7】对半搜索递归算法 template int SortableList { if (left<=right){//若表(子表)非空 int m=(left+right)/2。//对半分割 if (x else if (x>l[m]) return BSearch(x, m+1, right)。//搜索右半子表 else return m。//搜索成功 }