算法分析和设计Word文档格式.docx
《算法分析和设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法分析和设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
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时,算法就提高到了一个难以解决的地步。
这种持续的依赖最终将会导致没有自己的思维模式和想法。
算法也是程序员的基础,一个优秀的程序员必须对算法有着深刻的理解。
虽然我们这学期的算法课没让我们收获什么实质性的东西,但是我们还是理解学校开这门课的目的。
有些东西不一定是要在课上才能学到的,主要还是依靠自己,看自己到底想不想学。
我们完全可以在图书馆提供的优秀资源供应下学到精深的算法思想。
而这些仅仅依靠老师的几节课是无法搞定的。
所以,在以后的学习生活当中,我要始终坚持算法的学习,没学到一个算法就意味着多一点获得与成功,就比别人多一点竞争优势。