算法分析和设计Word文档格式.docx

上传人:b****3 文档编号:16600339 上传时间:2022-11-24 格式:DOCX 页数:11 大小:113.28KB
下载 相关 举报
算法分析和设计Word文档格式.docx_第1页
第1页 / 共11页
算法分析和设计Word文档格式.docx_第2页
第2页 / 共11页
算法分析和设计Word文档格式.docx_第3页
第3页 / 共11页
算法分析和设计Word文档格式.docx_第4页
第4页 / 共11页
算法分析和设计Word文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

算法分析和设计Word文档格式.docx

《算法分析和设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法分析和设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

算法分析和设计Word文档格式.docx

cout<

<

"

Pleaseinputthenumberofnumbers:

;

cin>

>

n;

num=(int*)malloc(n*sizeof(int));

for(inti=0;

i<

i++)

*(num+i);

Beforesorted:

\n"

for(i=0;

*(num+i)<

"

BubbleSort(num,n);

\nAftersorted:

}

冒泡排序

入口参数:

数组名和数组长度

出口参数:

数组进行排序后的结果

voidBubbleSort(int*num,intn)

inti,j;

intt;

//用来交换数据的

n-1;

for(j=n-1;

j>

i;

j--)

if(*(num+j)<

*(num+j-1))

t=*(num+j);

*(num+j)=*(num+j-1);

*(num+j-1)=t;

程序运行结果:

2、写出汉诺塔问题的递归算法程序。

写出n=3和n=4时,圆盘的移动总次数和每步移动过程。

intstep=0;

//汉诺塔中盘子的数目

voidHanoi(charc1,charc2,charc3,intn);

//汉诺塔算法

Pleaseinputthenumberofsaucers:

Hanoi('

A'

'

B'

C'

n);

Allsteps:

step<

endl;

//将n个碟子从c1到c3,可以借助c2

voidHanoi(charc1,charc2,charc3,intn)

voidMove(charc1,charc2,intn);

if(n>

0){

Hanoi(c1,c3,c2,n-1);

Move(c1,c3,n);

Hanoi(c2,c1,c3,n-1);

voidMove(charc1,charc2,intn)

{//表示将号码为n的碟子从c1移到c2

step++;

c1<

-->

c2<

n<

}程序运行结果:

三个碟子的情况:

四个碟子的情况:

实验二、分治算法

1、熟悉二分搜索算法;

2、初步掌握分治算法,分治法找最小值和最大值;

二、实验内容:

掌握分治算法的基本思想,分析并掌握“二分法”。

1、设a[0:

n-1]是一个已排好序的数组。

请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。

当搜索元素在数组中时,I和j相同,均为x在数组中的位置。

程序代码如下:

intnum[10]={1,2,3,4,5,7,8,9,10,11};

//查找数据源的数组

intn=10;

//数组的长度

intfind;

//要查找的数

intformer,latter;

//前后的位置

voidFindNum(int*num,intn,intfindnum,int*former,int*latter);

请输入要查找的数据:

find;

FindNum(num,n,find,&

former,&

latter);

if(former==latter&

&

former!

=-1&

latter!

=n)

Thelocationis:

former<

else

Cannotfindthisnumber:

Theformerlocationis:

Thelatterlocationis:

latter<

voidFindNum(int*num,intn,intfindnum,int*former,int*latter)

{//入口参数:

num是入口数组地址,n表示长度,former表示前面的数的地址,latter表示后面的

//出口参数:

结果保存在former和latter中

//如果比最小的都小,则给former和latter-1

//如果比最大的都大,则给n

*former=0;

*latter=n-1;

intmiddle;

if(findnum<

*num)

*(former)=-1;

*(latter)=-1;

elseif(findnum>

*(num+n-1))

*(former)=n;

*(latter)=n;

while((*former)<

(*latter))

middle=((*former)+(*latter))/2;

if(findnum==*(num+middle))

*former=middle;

*latter=middle;

return;

elseif(findnum<

*(num+middle))

*latter=middle-1;

*former=middle+1;

}运行结果如下:

2、设有n个不同的整数排好序后存放于t[0:

n-1]中,若存在一个下标I,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。

在下标从begin到end的数组中找下标等于值的下标

intFindAi(int*num,intbegin,intend)

while(begin<

end)

n=(begin+end)/2;

if(num[n]>

n)

end=n-1;

elseif(num[n]<

begin=n+1;

returnn;

intnum[10]={-1,0,2,4,9,10,12,34,45,56};

FindAi(num,0,9)<

运行结果如下:

3、使用一般方法和分治方法找最大值和最小值

一般方法:

使用蛮力法查找最大值和最小值:

voidFindMaxMinNormal(int*num,intn,int*max,int*min){

inti;

//计数器

*max=*num;

*min=*num;

if(*max<

*(num+i))

*max=*(num+i);

elseif(*min>

*min=*(num+i);

分治法实现:

Num是数组名,

Begin是开始的下标

End是结束的下标

Max和min是存放结果的地方

voidFindMaxMinDivide(int*num,intbegin,intend,int*max,int*min){

inttempMax1,tempMax2,tempMin1,tempMin2;

tempMax1=*num;

tempMin1=*num;

tempMax2=*num;

tempMin2=*num;

if(end==begin)

*max=*(num+begin);

*min=*(num+end);

FindMaxMinDivide(num,begin,(begin+end)/2,&

tempMax1,&

tempMin1);

FindMaxMinDivide(num,(begin+end)/2+1,end,&

tempMax2,&

tempMin2);

if(tempMax1>

tempMax2)

*max=tempMax1;

*max=tempMax2;

if(tempMin1<

tempMin2)

*min=tempMin1;

*min=tempMin2;

intway;

intmax,min;

Pleaseinputthesizeofthearray:

Inputthenumbers:

1:

normalway2:

dividedway\n"

Pleaseinputthewayyouwanttouse:

way;

if(way==1)

FindMaxMinNormal(num,n,&

max,&

min);

elseif(way==2)

FindMaxMinDivide(num,0,n-1,&

themaxnumberis:

max<

theminnumberis:

min<

一般方法的运行结果:

分支方法的运行结果:

思考与总结:

算法的重要性毋庸置疑,他是软IT的重头戏。

优秀的算法是一种智慧,这种智慧会产生许多社会效益和经济效益。

IT是个肥沃而勃勃生机的生态圈,不断孕育着一代又一代的新技术、新概念,而那些站在科技浪尖的自然成为开发者的宠儿。

无论IT的浪潮多么朝夕莫测、滚滚而来,计算机和软件发展背后的根基却岿然屹立、经年不变,算法便是基础之一。

虽然现在算法已经被包装到了语言和工具中,这也成为不少开发者逃避学习算法的借口。

但是这并不能作为我们逃避学习算法的理由,因为这些算法对于开发者来说是透明的,往往一个算法对于某种工具来说是可行的,但是对于另一种语言或者另一种算法来说却不一定可行。

况且对于程序员来说,过分依赖编译器会导致思路界定,无法深入的了解其内核。

因此,当自己的软件出现无法解决的问题或者BUG时,算法就提高到了一个难以解决的地步。

这种持续的依赖最终将会导致没有自己的思维模式和想法。

算法也是程序员的基础,一个优秀的程序员必须对算法有着深刻的理解。

虽然我们这学期的算法课没让我们收获什么实质性的东西,但是我们还是理解学校开这门课的目的。

有些东西不一定是要在课上才能学到的,主要还是依靠自己,看自己到底想不想学。

我们完全可以在图书馆提供的优秀资源供应下学到精深的算法思想。

而这些仅仅依靠老师的几节课是无法搞定的。

所以,在以后的学习生活当中,我要始终坚持算法的学习,没学到一个算法就意味着多一点获得与成功,就比别人多一点竞争优势。

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

当前位置:首页 > 工程科技 > 兵器核科学

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

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