常用软考算法大全内附实例.docx

上传人:b****7 文档编号:26054569 上传时间:2023-06-17 格式:DOCX 页数:83 大小:307.25KB
下载 相关 举报
常用软考算法大全内附实例.docx_第1页
第1页 / 共83页
常用软考算法大全内附实例.docx_第2页
第2页 / 共83页
常用软考算法大全内附实例.docx_第3页
第3页 / 共83页
常用软考算法大全内附实例.docx_第4页
第4页 / 共83页
常用软考算法大全内附实例.docx_第5页
第5页 / 共83页
点击查看更多>>
下载资源
资源描述

常用软考算法大全内附实例.docx

《常用软考算法大全内附实例.docx》由会员分享,可在线阅读,更多相关《常用软考算法大全内附实例.docx(83页珍藏版)》请在冰豆网上搜索。

常用软考算法大全内附实例.docx

常用软考算法大全内附实例

常用算法大全

 

【程序1-1】欧几里德递归算法

voidSwap(int&a,int&b)

{

intc=a;a=b;b=c;

}

intRGcd(intm,intn)

{

if(m==0)returnn;

returnRGcd(n%m,m);

}

intGcd(intm,intn)

{

if(m>n)Swap(m,n);

returnRGcd(m,n);

}

【程序1-2】欧几里德迭代算法

intGcd(intm,intn)

{

if(m==0)returnn;if(n==0)returnm;

if(m>n)Swap(m,n);

while(m>0){

intc=n%m;n=m;m=c;

}

returnn;

}

【程序1-3】Gcd的连续整数检测算法

intGcd(intm,intn)

{

if(m==0)returnn;if(n==0)returnm;

intt=m>n?

n:

m;

while(m%t||n%t)t--;

returnt;

}

【程序1-4】求Fn

longFib(longn)

{

if(n<=1)returnn;

elsereturnFib(n-2)+Fib(n-1);

}

【程序1-5】逆序输出正整数的各位数

#include

voidPrintDigit(unsignedintn)

{//设k位正整数为d1d2dk,按各位数的逆序dkdk1d1形式输出

cout<

if(n>=10)PrintDigit(n/10);//以逆序输出前k-1位数

}

voidmain()

{

unsignedintn;

cin>>n;

PrintDigit(n);

}

【程序1-6】汉诺塔问题

#include

enumtower{A='X',B='Y',C='Z'};

voidMove(intn,towerx,towery)

{//将第n个圆盘从塔座x移到塔座y的顶部

cout<<"Thedisk"<

<

}

voidHanoi(intn,towerx,towery,towerz)

{//将塔座x上部的n个圆盘移到塔座y上,顺序不变。

if(n){

Hanoi(n-1,x,z,y);//将前n-1个圆盘从塔座x移到塔座z,塔座y为中介

Move(n,x,y);//将第n个圆盘从塔座x移到塔座y

Hanoi(n-1,z,y,x);//将塔座z上的n-1个圆盘移到塔座y上,塔座x为中介

}

}

voidmain()

{

Hanoi(4,A,B,C);//假定n=4

}

【程序1-7】排列产生算法

template

voidPerm(Ta[],intk,intn)

{

if(k==n-1){//输出一种排列

for(inti=0;i

cout<

}

else//产生{a[k],…,a[n-1]}各种排列

for(inti=k;i

Tt=a[k];a[k]=a[i];a[i]=t;

Perm(a,k+1,n);//产生{a[k+1],…,a[n-1]}各种排列

t=a[k];a[k]=a[i];a[i]=t;

}

}

【程序2-1】求数组元素累加之和的迭代程序

floatSum(floatlist[],constintn)

{

floattempsum=0.0;

count++;//针对赋值语句

for(inti=0;i

count++;//针对for循环语句

tempsum+=list[i];

count++;//针对赋值语句

}

count++;//针对for的最后一次执行

count++;//针对return语句

returntempsum;

}

【程序2-2】求数组元素累加之和的递归程序

floatRSum(floatlist[],constintn)

{

count++;//针对if条件

if(n){

count++;//针对RSum调用和return语句

returnRSum(list,n-1)+list[n-1];

}

count++;//针对return语句

return0;

}

【程序2-3】矩阵乘法

for(i=0;i

for(j=0;j

c[i][j]=0;//n2

for(k=0;k

c[i][j]+=a[i][k]*b[k][j];//n3

}

【程序3-1】伸展树类

#include

enumResultCode{Underflow,Overflow,Success,Duplicate,Fail,NotPresent};

template

structBTNode

{//二叉树结点类

BTNode(constT&x)

{

element=x;lChild=rChild=NULL;

}

Telement;

BTNode*lChild,*rChild;

};

template

classSPTree

{//伸展树类

public:

SPTree(){root=NULL;}

ResultCodeInsert(Tx);

protected:

BTNode*root;

private:

ResultCodeInsert(BTNode*&p,Tx);

voidLRot(BTNode*&p);

voidRRot(BTNode*&p);

};

【程序3-2】旋转函数

template

voidSPTree:

:

LRot(BTNode*&p)

{//前置条件:

p有右孩子,实现向左旋转

BTNode*r=p->rChild;

p->rChild=r->lChild;

r->lChild=p;p=r;//p的右孩子成为子树根

}

template

voidSPTree:

:

RRot(BTNode*&p)

{//前置条件:

p有左孩子,实现向右旋转

BTNode*r=p->lChild;

p->lChild=r->rChild;

r->rChild=p;p=r;//p的左孩子成为子树根

}

【程序3-3】伸展树插入

template

ResultCodeSPTree:

:

Insert(Tx)

{

returnInsert(root,x);

}

template

ResultCodeSPTree:

:

Insert(BTNode*&p,Tx)

{//假定T类上已重载了关系运算符或类型转换运算符①

ResultCoderesult=Success;

BTNode*r;

if(p==NULL){//插入新结点

p=newBTNode(x);returnresult;

}

if(x==p->element){

result=Duplicate;returnresult;

}

if(xelement){

r=p->lChild;

if(r==NULL){//zig旋转

r=newBTNode(x);r->rChild=p;p=r;

returnresult;

}

elseif(x==r->element){//zig旋转

RRot(p);result=Duplicate;returnresult;

}

if(xelement){//zigzig旋转

result=Insert(r->lChild,x);

RRot(p);

}

else{//zigzag旋转

result=Insert(r->rChild,x);

LRot(r);p->lChild=r;

}

RRot(p);

}

else{

r=p->rChild;

if(r==NULL){

r=newBTNode(x);r->lChild=p;p=r;

returnresult;

}

elseif(x==r->element){

LRot(p);//zag旋转

result=Duplicate;returnresult;

}

if(x>r->element){//zagzag旋转

result=Insert(r->rChild,x);

LRot(p);

}

else{//zagzig旋转

result=Insert(r->lChild,x);

RRot(r);p->rChild=r;

}

LRot(p);

}

returnresult;

}

【程序3-4】跳表结点类

template

structSNode

{

SNode(intmSize)

{

link=newSNode*[mSize];

}

~SNode(){delete[]link;}

Telement;

SNode**link;

};

【程序3-5】跳表类

template

classSkipList

{

public:

SkipList(Tlarge,intmLev);

~SkipList();

ResultCodeInsert(Tx);//函数定义见3.1.1节

private:

intLevel();

SNode*SaveSearch(Tx);

intmaxLevel,levels;

SNode*head,*tail,**last;

};

【程序3-6】构造函数

template

SkipList:

:

SkipList(Tlarge,intmLev)

{

maxLevel=mLev;levels=0;

head=newSNode(maxLevel+1);//指向包括元素域和maxLevel+1个指针的头结点

tail=newSNode(0);//指向只有元素域,不包含指针域的尾结点

last=newSNode*[maxLevel+1];//maxLevel+1个指针

tail->element.key=large;//尾结点中保存作为哨兵值的最大值large

for(inti=0;i<=maxLevel;i++)

head->link[i]=tail;//头结点的所有指针指向尾结点

}

【程序3-7】级数分配

template

intSkipList:

:

Level()

{

intlev=0;

while(rand()<=RAND_MAX/2)lev++;

return(lev<=maxLevel)?

lev:

maxLevel;

}

【程序3-8】插入运算

enumResultCode{Underflow,Overflow,Success,Duplicate,RangeError,NotPresent};

template

SNode*SkipList:

:

SaveSearch(Tx)

{//假定T类已重载了关系运算符或类型转换运算符

SNode*p=head;

for(inti=levels;i>=0;i--){

while(p->link[i]->elementlink[i];

last[i]=p;//将最后搜索到的第i层结点的地址保存在last[i]中

}

return(p->link[0]);

}

template

ResultCodeSkipList:

:

Insert(Tx)

{

if(x>=tail->element)returnRangeError;

SNode*p=SaveSearch(x);

if(p->element==x)returnDuplicate;//表明有重复元素

intlev=Level();//计算级数

if(lev>levels){

lev=++levels;last[lev]=head;

}

SNode*y=newSNode(lev+1);//构造新结点

y->element=x;

for(inti=0;i<=lev;i++){//新结点插入各级链中

y->link[i]=last[i]->link[i];

last[i]->link[i]=y;

}

returnSuccess;

}

【程序4-1】ENode类

enumColorType{White,Gray,Black};

structENode

{

intadjVex;

ENode*nextArc;

};

classGraph

{

public:

Graph(intmSize)

{//构造仅有n个结点的图的邻接表

n=mSize;

a=newENode*[n];

for(inti=0;i

}

voidDFS_Traversal(int*parent);//一维数组parent保存DFS生成森林

voidBFS_Traversal(int*prarent);//一维数组parent保存BFS生成森林

protected:

voidDFS(intu,int*parent,ColorType*color);//递归DFS函数访问从u可达结点

voidBFS(intu,int*parent,ColorType*color);//BFS函数访问从u可达结点

ENode**a;//生成指向ENode类对象的指针数组

intn;//图中结点数目

};

【程序4-2】图的广度优先遍历

voidGraph:

:

BFS_Traversal(int*parent)

{//遍历算法将在parent数组中返回以双亲表示法表示的BFS生成森林

ColorType*color=newColorType[n];//颜色数组

cout<

";

for(intu=0;u

color[u]=White;parent[u]=-1;

}

for(u=0;u

if(color[u]==White)BFS(u,parent,color);//从未标记的结点出发进行BFS

delete[]color;

cout<

}

voidGraph:

:

BFS(intu,int*parent,ColorType*color)

{//广度优先搜索算法

Queueq(QSize);

color[u]=Gray;cout<<""<

q.Append(u);//将起始结点u加入队列q

while(!

q.IsEmpty()){

u=q.Front();q.Serve();//选择一个活结点为E-结点

for(ENode*w=a[u];w;w=w->nextArc){//检测E-结点u的全部邻接点

intv=w->adjVex;

if(color[v]==White){

color[v]=Gray;cout<<""<

parent[v]=u;//构造BFS生成森林

q.Append(v);//新的活结点进入活结点表q

}

}

color[u]=Black;//标记死结点

}

}

【程序4-3】图的深度优先搜索

voidGraph:

:

DFS(intu,int*parent,ColorType*color)

{

color[u]=Gray;cout<<""<

d[u]=time++;//记录第1个时间

for(ENode*w=a[u];w;w=w->nextArc){

intv=w->adjVex;

if(color[v]==White){

parent[v]=u;

DFS(v,parent,color);

}

}

color[u]=Black;f[u]=time++;//记录第2个时间

}

【程序4-4】计算d和Low

voidGraph:

:

DFS(intu,intp)

{//u是起始结点,p是u的双亲结点

Low[u]=d[u]=time++;//Low[u]=d[u]

for(ENode*w=a[u];w;w=w->nextArc){

intv=w->adjVex;

if(d[v]==-1){//表示v尚未访问

DFS(v,u);

if(Low[u]>Low[v])Low[u]=Low[v];//是树边

}

elseif(v!

=p&&Low[u]>d[v])Low[u]=d[v]//是反向边

}

}

【程序4-5】求双连通分量

voidGraph:

:

BiCom(intu,intp)

{

Low[u]=d[u]=time++;eNodee;

for(ENode*w=a[u];w;w=w->nextArc){

intv=w->adjVex;

e.u=u;e.v=v;

if(v!

=p&&d[v]

if(d[v]==-1){

BiCom(v,u);

if(Low[v]>=d[u]){

cout<

do{

e=s.Top();s.Pop();

if(ue.v)Swap(e.u,e.v);

elseif(u>v&&e.u

cout<<"("<

}while(e.u!

=u||e.v!

=v);

}

if(Low[u]>Low[v])Low[u]=Low[v];

}

elseif(v!

=p&&Low[u]>d[v])Low[u]=d[v];

}

}

【程序4-6】与或树及其结点类型

enumNType{A,O,S,U};

template

structTNode

{

TNode(constT&x,intd,NTypec)

{

element=x;tp=c;

p=newTNode*[d];

for(inti=0;i

}

Telement;//元素

NTypetp;//结点类型

TNode**p;//指向孩子的指针

};

template

classAndOrTree

{

public:

AndOrTree(intdegree);

intSolvable()

{

returnPostOrder(root);

}

……

private:

intPostOrder(TNode*t);//判定与或树是否可解

……

TNode*root;

intd;

};

【程序4-7】判断与或树是否可解算法

template

intAndOrTree:

:

PostOrder(TNode*t)

{

inti;

switch(t->tp){

caseS:

return1;

caseU:

return0;

caseA:

for(i=0;ip[i]&&!

Post

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1