算法设计与分析书中程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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::MaxMin(T& max, T& min)const

{

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::MaxMin(int i, int j, T& max, T& min) const

{ //前置条件: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::BSearch(const T& x, int left, int right)const

{

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::BSearch(const T& x, int left, int right)const

{

if (left<=right){//若表(子表)非空

int m=(left+right)/2。//对半分割

if (x

else if (x>l[m]) return BSearch(x, m+1, right)。//搜索右半子表

else return m。//搜索成功

}

相关文档
最新文档