ImageVerifierCode 换一换
格式:DOCX , 页数:86 ,大小:45.20KB ,
资源ID:7304431      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7304431.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析所有程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析所有程序.docx

1、算法设计与分析所有程序第二章 递归与分治1、用递归思想求N!王晓东版计算机算法设计与分析(第四版) P11页,例21#include void main() long n; int JieChen(int n); printf(请输入一个数n); scanf(%ld,&n); long result = JieChen(n); printf(%ld,result);int JieChen(int n) if(n=1) return 1; else return n*JieChen(n-1);2、用递归思想求Fibonacci数列王晓东版计算机算法设计与分析(第四版) P12页,例22int F

2、ibonacci(int n) if(n=1) return 1; else return Fibonacci(n-1)+Fibonacci(n-2);void main() long n; printf(请输入一个数n); scanf(%ld,&n); long result = Fibonacci(n); printf(%ldn,result);3、用递归思想求排列问题王晓东版计算机算法设计与分析(第四版) P13页,例24N个元素的全排列的个数为:N!本算法非常重要,因为它是很多算法的基础,比如回溯法那章里的算法很多都是以本算法为基础的。#include / 交换两个元素的值void S

3、wap(int &x,int &y) int t = x; x = y; y = t;/ 产生listk:m的所有排列/ m 是最后一个元素在数组中的下标void Perm(int list,int k,int m) if(k=m)/ 如果只有一个元素 for(int i=0;i=m;i+) printf(%d ,listi); printf(n); else for(int i=k;i=m;i+) Swap(listi,listk); Perm(list,k+1,m); Swap(listi,listk); / 将元素还原 void main() int a5 = 1,2,3,4,5; /

4、求数组前面三个元素的全排列 Perm(a,0,3);4、用递归思想求整数划分问题王晓东版计算机算法设计与分析(第四版) P14页,例25整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+mi; (其中mi为正整数,并且1 = mi = n),则m1,m2,.,mi为n的一个划分。如果m1,m2,.,mi中的最大值不超过m,即max(m1,m2,.,mi)0),只有一种划分即1;(2) 当 m=1 时,不论n的值为多少,只有一种划分即n个1,1,1, 1, ., 1 ;(3) 当 n=m 时,根据划

5、分中是否包含 n,可以分为两种情况:(a). 划分中包含n的情况,只有一个即 n ;(b). 划分中不包含n的情况,这时划分中最大的数字也一定比 n 小,即 n 的所有 ( n - 1 ) 划分。因此 f(n, n) = 1 + f(n, n-1);(4) 当 n m 时,根据划分中是否包含最大值 m,可以分为两种情况:(a). 划分中包含m的情况,即m,x1,x2, .,xi,其中x1,x2, .,xi 的和为n-m,可能再次出现m,因此是(n-m)的m划分,因此这种划分个数为f(n-m, m);(b). 划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分个数为f(n, m

6、- 1);因此 f(n, m) = f(n-m, m) + f(n, m-1);综合以上情况,我们可以看出,上面的结论具有递归定义特征,其中(1)和(2)属于回归条件,(3)和(4)属于特殊情况,将会转换为情况(5)。而情况(5)为通用情况,属于递推的方法,其本质主要是通过减小m以达到回归条件,从而解决问题。其递推表达式如下:f(n, m) = 1; ( n = 1 or m = 1 )f(n, m) = f(n, n); ( n m ) 因此我们可以给出求出 f(n, m) 的递归函数代码如下。/ 求整数n的全部划分数,其中max代表最大加数long GetPartitionCount(in

7、t n, int max) if (n = 1 | max = 1) return 1; else if (n 0) Hanoi(n-1,A,C,B); printf(%d,%c-%cn,n,A,B); / 模拟移动过程 Hanoi(n-1,C,B,A); void main() Hanoi(3,a,b,c); 6、用递归思想实现插入排序#include #include #include void insertSort(int *aa,int n) if(n0) n = n-1; insertSort(aa,n); int a= aan; int k = n-1; while(k=0)& a

8、aak) aak+1 = aak; k-; aak+1 = a; void main() int a10; srand(unsigned int)time(NULL); for(int i=0;i10;i+) ai = rand()%100; printf(%d ,ai); printf(n); insertSort(a,10); for(i=0;iright) return -1; if(x=amiddle) return middle; else if(xamiddle) return BinarySearch(a,x,middle+1,right); else return Binary

9、Search(a,x,left,middle-1); void main() int a9=-2,2,7,9,19,21,34,65,98; int index = BinarySearch(a,100,8); printf(%dn,index);方法二:用循环代替递归/ 在a数组里查找是否存在x这个元素,如果存在,则返回元素所在下标,如果不存在/ 则返回-1/ n为最后一个元素的下标int BinarySearch(int a,int x,int n) int left = 0; / 开始需要查找元素的下标 int right = n-1; / 最后需要查找元素的下标 while(lefta

10、middle) left = middle+1; else right = middle-1; return -1;8、用分治法求两个大整数的乘法最简单的方法,这里没有体现分治法的思想#include int main() char a100,b100,s202; int i,j,g,t=0,k=0,temp; printf(请输入两个大整数,空格分隔n); scanf(%s%s,&a,&b); int m = strlen(a); int n = strlen(b); while(km+n-2) sk=0; temp=0; for(i=0;im;i+) for(j=0;jn;j+) if(

11、(i+j) = k ) /第k位上所有数字之和 temp += (am-1-i-48)*(bn-1-j-48); g=(temp+t)%10; t=(temp+t)/10; / t用来保存进位 sk=g; k+; / 求最高1位或者2位,并输出 temp=0; for(i=0;im;i+) for(j=0;j=0;i-) printf(%d,si); printf(n); return 0;9、用分治思想求一个数组的最大值与最小值#include #include #include #define LEN 8void maxmin(int a,int *max,int *min,int low

12、,int high) int mid,max1,min1,max2,min2; if(high-low)=alow) *max = ahigh; *min = alow; else *max = alow; *min = ahigh; else mid = (high+low)/2; maxmin(a,&max1,&min1,low,mid); maxmin(a,&max2,&min2,mid+1,high); *max = max1max2?max1:max2; *min = min1min2?min1:min2; void main() int aLEN; int max=-1,min=1

13、000; srand(unsigned)time(NULL); printf(数组里的元素为:n); for(int i=0;iLEN;i+) ai = rand()%100; printf(%d ,ai); maxmin(a,&max,&min,0,LEN-1); printf(n最大值为:%d n最小值为:%dn,max,min);#include #include #include #define LEN 8void main() int aLEN; srand(unsigned)time(NULL); printf(数组里的元素为:n); for(int i=0;iLEN;i+) ai

14、 = rand()%100; printf(%d ,ai); */10、用分法思想实现合并排序#includeint b9;void merge(int c,int d,int l,int m,int r) int i=l,j=m+1,k=l; while(i=m)&(j=r) if(ci=cj) dk+=ci+; else dk+=cj+; / 将剩余部分处理好 while(j=r) dk+=cj+; while(i=m) dk+=ci+; void mergesort(int a,int left,int right) if(leftright) int i=(left+right)/2;

15、 mergesort(a,left,i); / 将左边部分排好序 mergesort(a,i+1,right); / 将右边部分排好序 merge(a,b,left,i,right); / 将左右两边合并 for(int j=left;j=right;j+) aj = bj; void main() int a9=4,3,6,8,9,1,25,2,34; printf(原始数据为:n); for(int i=0;i9;i+) printf(%dt,ai); mergesort(a,0,8); printf(n合并后的数据为:n); for(i=0;i9;i+) printf(%dt,ai);

16、printf(n);11、用分治思想实现快速排序#includevoid quicksort(int a,int p,int r) int partition(int a,int p,int r); if(pr)/ 不止一个元素时 int q = partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); / 以ap为基准,将数组ap-ar段元素分为两部,其实一部分/ 比ap小,另一部分比ap大,/ 返回值为ap最终所在位置int partition(int a,int p,int r) void swap(int * x,int * y

17、); int i=p,j=r+1; int x=ap; while(true) while(a+ix & ix & jp); if(i=j) break; swap(&ai,&aj); ap=aj; aj=x; return j;void swap(int * x,int * y) int t; t = *x; *x = *y; *y = t;void main() int a9=9,8,7,6,5,4,3,2,1; printf(n排序前的结果n); for(int i=0;i9;i+) printf(%dt,ai); quicksort(a,0,8); printf(n排序后的结果n);

18、for( i=0;i9;i+) printf(%dt,ai); printf(n);如果每次划分不以ap为基准,而是随机从ap-ar里取一个数为基准,则可以设计如下随机化快速排序算法。/ 随机选择策略的划分算法,需要调用partition函数int RandomizedPartition(int a,int p,int r) srand(unsigned int)time(NULL); int i = p+rand()%(r-p+1); swap(&ai,&ap); return partition(a,p,r);12、用分治法实现线性时间选择问题本算法要用到上面快速排序的随机划分算法int

19、RandomizedSelect(int a,int p,int r,int k) if(p=r) / 如果只剩下一个数,则这个肯定就是第k小的数 return ap; else int i = RandomizedPartition(a,p,r); / 经过快速排序进行划分 int j = i-p+1; / 计算通过划分后,从ap到ai有多少数 if(k=j) / 第k小的数在ai的前半段 return RandomizedSelect(a,p,i,k); else / 第k小的数在ai的后半段,并且从ap到ai这些数都小于第k小的数 return RandomizedSelect(a,i+

20、1,r,k-j); 13、用分法思想实现残缺棋盘问题王晓东版计算机算法设计与分析(第四版) P20页,例2.6注意:同一种形状的骨牌,在填充时数字不一样,关键看三个相同数字摆放位置所构成的形状。#include int tile=1; /L型骨牌的编号(递增)int board100100; /棋盘/* tr-当前棋盘左上角的行号* tc-当前棋盘左上角的列号* dr-当前特殊方格所在的行号* dc-当前特殊方格所在的列号* size:当前棋盘的:2k*/void chessBoard ( int tr, int tc, int dr, int dc, int size ) if ( size

21、=1 ) /棋盘方格大小为1,说明递归到最里层 return; int t=tile+; /每次递增1 int s=size/2; /棋盘中间的行、列号(相等的) /检查特殊方块是否在左上角子棋盘中 if ( drtr+s & dctc+s ) /在 chessBoard ( tr, tc, dr, dc, s ); else /不在,将该子棋盘右下角的方块视为特殊方块 boardtr+s-1tc+s-1=t; chessBoard ( tr, tc, tr+s-1, tc+s-1, s ); if ( dr=tc+s ) /在 chessBoard ( tr, tc+s, dr, dc, s ); else /不在,将该子棋盘左下角的方块视为特殊方块 boardtr+s-1tc+s=t; chessBoard ( tr, tc+s, tr+s-1, tc+s, s ); /检查特殊方块是否在左下角子棋盘中 if ( dr=tr+s & dc=tr+s & dc=tc+s ) chessBoard ( tr+s, tc+s, dr, dc, s ); else boardtr+stc+s=t

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

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