1、coutn;num=(int *)malloc(n*sizeof(int);for(int i=0;ii+)*(num+i);Before sorted:nfor(i=0;*(num+i)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时,圆盘的移动总次数和每步移动过程。int step=0;/汉诺塔中盘子的数目void Hanoi(char c1,char c2,char c3,int n);/汉诺塔算法Please input the
2、 number of saucers:Hanoi(A,BC,n);All steps:step0)Hanoi(c1,c3,c2,n-1);Move(c1,c3,n);Hanoi(c2,c1,c3,n-1);void Move(char c1,char c2,int n)/表示将号码为n的碟子从c1移到c2step+;c1c2n 程序运行结果:三个碟子的情况:四个碟子的情况:实验二、分治算法1、熟悉二分搜索算法;2、初步掌握分治算法,分治法找最小值和最大值; 二、实验内容:掌握分治算法的基本思想,分析并掌握“二分法”。1、设a0:n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不
3、在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。程序代码如下:int num10=1,2,3,4,5,7,8,9,10,11;/查找数据源的数组int n=10;/数组的长度int find;/要查找的数int former,latter;/前后的位置void FindNum(int *num,int n,int findnum,int *former,int *latter);请输入要查找的数据:find;FindNum(num,n,find,&former,&latter);if(former=latter&form
4、er!=-1&latter!=n)The location is:formerelseCannot find this number:The former location is:The latter location is:lattervoid FindNum(int *num,int n,int findnum,int *former,int *latter)/入口参数:num是入口数组地址,n表示长度,former表示前面的数的地址,latter表示后面的/出口参数:结果保存在former和latter中/如果比最小的都小,则给former和latter -1/如果比最大的都大,则给n*
5、former=0;*latter=n-1;int middle;if(findnum*(num+n-1)*(former)=n;*(latter)=n;while(*former)(*latter)middle=(*former)+(*latter)/2;if(findnum=*(num+middle)*former=middle;*latter=middle;return;else if(findnum*(num+middle)*latter=middle-1;*former=middle+1;运行结果如下:2、设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标I,0in,使得t
6、i=i,设计一个有效的算法找到这个下标。在下标从begin到end的数组中找下标等于值的下标int FindAi(int *num,int begin,int end)while(beginn)end=n-1;else if(numnbegin=n+1;return n;int num10=-1,0,2,4,9,10,12,34,45,56;FindAi(num,0,9)运行结果如下:3、使用一般方法和分治方法找最大值和最小值一般方法:使用蛮力法查找最大值和最小值:void FindMaxMinNormal(int *num, int n, int *max, int *min) int i;
7、/计数器*max=*num;*min=*num;if(*max*min=*(num+i);分治法实现:Num是数组名,Begin是开始的下标End是结束的下标Max和min是存放结果的地方void FindMaxMinDivide(int *num,int begin,int end,int *max,int *min) int tempMax1,tempMax2,tempMin1,tempMin2;tempMax1=*num;tempMin1=*num;tempMax2=*num;tempMin2=*num;if(end=begin)*max=*(num+begin);*min=*(num+
8、end);FindMaxMinDivide(num,begin,(begin+end)/2,&tempMax1,&tempMin1); FindMaxMinDivide(num,(begin+end)/2+1,end,&tempMax2,&tempMin2); if(tempMax1tempMax2)*max=tempMax1;*max=tempMax2;if(tempMin1tempMin2)*min=tempMin1;*min=tempMin2;int way;int max,min;Please input the size of the array:Input the numbers:
9、1:normal way 2:divided waynPlease input the way you want to use:way;if(way=1)FindMaxMinNormal(num,n,&max,&min);else if(way=2)FindMaxMinDivide(num,0,n-1,&the max number is:maxthe min number is:min一般方法的运行结果:分支方法的运行结果:思考与总结:算法的重要性毋庸置疑,他是软IT的重头戏。优秀的算法是一种智慧,这种智慧会产生许多社会效益和经济效益。IT是个肥沃而勃勃生机的生态圈,不断孕育着一代又一代的新
10、技术、新概念,而那些站在科技浪尖的自然成为开发者的宠儿。无论IT的浪潮多么朝夕莫测、滚滚而来,计算机和软件发展背后的根基却岿然屹立、经年不变,算法便是基础之一。虽然现在算法已经被包装到了语言和工具中,这也成为不少开发者逃避学习算法的借口。但是这并不能作为我们逃避学习算法的理由,因为这些算法对于开发者来说是透明的,往往一个算法对于某种工具来说是可行的,但是对于另一种语言或者另一种算法来说却不一定可行。况且对于程序员来说,过分依赖编译器会导致思路界定,无法深入的了解其内核。因此,当自己的软件出现无法解决的问题或者BUG时,算法就提高到了一个难以解决的地步。这种持续的依赖最终将会导致没有自己的思维模式和想法。算法也是程序员的基础,一个优秀的程序员必须对算法有着深刻的理解。虽然我们这学期的算法课没让我们收获什么实质性的东西,但是我们还是理解学校开这门课的目的。有些东西不一定是要在课上才能学到的,主要还是依靠自己,看自己到底想不想学。我们完全可以在图书馆提供的优秀资源供应下学到精深的算法思想。而这些仅仅依靠老师的几节课是无法搞定的。所以,在以后的学习生活当中,我要始终坚持算法的学习,没学到一个算法就意味着多一点获得与成功,就比别人多一点竞争优势。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1