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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法设计王茂林.docx

1、算法设计王茂林实验一 递归与分治 姓 名:王 茂 林 班 级:信 息 1411 学 号:2014125104指导老师:潘 老 师实验目的:理解递归与分治算法设计思想和方法。实验课时:4学时实验原理:一个规模为n的复杂问题的求解:可以划分成若干个规模较小0) H(A,C,B,n-1); printf(“%d from %c to %c”,n,A,C); H(B,A,C,n-1); -c语言实验代码:#include void hanoi(int n , char X ,char Y, char Z) if(n = 1) printf(把%c移动到%c n,X,Z); else hanoi(n-1

2、,X,Z,Y); printf(把%c移动到%c n,X,Z); hanoi(n-1,Y,X,Z); main() int m; printf(请输入盘子的数目:); scanf(%d, &m); printf(要移动的盘子执行的步骤为:%d n,m); hanoi(m,A,B,C);实验结果:2、二分查找问题(1)设a0:n-1是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。*代码显示:#includeint binarySearch(int a,int n,

3、int x,int &i,int &j)/a 为要搜索的数组; n为数组元素的个数; x为要查询的元素值;/i为小于x的最大元素位置;j为大于x的最小元素的位置 int middle; /中值 int right=n-1; / 数组的右边界 int left=0; /数组的左边界 while(leftamiddle) left=middle+1; else /2016年11月3日测试成功。 right=middle-1; i=right; j=left; return -1; /查询失败int main(void) int i; int j; int middle; int b=1,2,3,4

4、,5,6,7,8,12,22; /用来测试的数组 middle=binarySearch(b,10,13,i,j);/调用二分搜索算法 if(middle!=-1) /查询成功 printf(the xs position is : %d,i is %d, j is %d n,middle,i,j); else /查询失败 printf(找不到这个元素: %d,j is %d n,i,j); return 0;结果显示:方法二:如果存在,必须返回下标#include using namespace std;const int SIZE = 12 ; int binarySearch(int A

5、rray,int x,int n,int &a ,int &b) int left=0; int right=n-1; int middle; while(leftArraymiddle) left=middle+1; else right=middle-1; a=right; b=left; return 1;int main() /于16年11月3日测试成功 int a,b; int t; int ArraySIZE=1,4,7,10,23,33,36,65,76,87,89,90; coutt; if( binarySearch(Array,t,SIZE,a,b)=0) cout查找的元

6、素存在!endl下标为:aendl; else cout查找的元素不存在!endl 大于X的最小元素的位置为:aendl 小于X的最大元素位置为:bendl; return 0;当输入元素存在时的下标显示:当输入结果不存在时,回馈最大最小元素(2)设有n个不同的整数排好序后存放于t0:n-1中,若存在一个下标i,0in,使得ti=i,设计一个有效的算法找到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。bool BinarySearch(int a,int n,int x,int& i,int& j) int left=0; int right=n-1; while(leftami

7、d) left=mid+1; else right=mid-1; i=right; j=left; return false;int SearchTag(int a,int n,int x) int left=0; int right=n-1; while(leftamid) right=mid-1; else left=mid+1; return -1;*代码实现:#include #define N 10bool BinarySearch(int a,int n,int x,int& i,int& j) int left=0; int right=n-1; while(leftamid)

8、left=mid; else right=mid; i=right; j=left; return false;int SearchTag(int a,int n) int left=0; int right=n-1; while(leftright-1) int mid=(left+right)/2; if(mid=amid) return mid; if(midamid) right=mid; else left=mid; return -1;int main(int argc) int aN; printf(请输入%d个由小到大排列的整数n以空格隔开,以回车结束n,N); int k;

9、for(k=0;kN;k+) scanf(%d,a+k); printf(你的输入如下:n); for(k=0;kN;k+) printf(%dt,k); /printf(n); for(k=0;kN;k+) printf(%dt,ak); printf(n); if(k=SearchTag(a,N)!=-1) printf(第%d个数字满足a%d=%dn,k,k,k); else printf(没有找到任何一个数字满足ai=in); int i,j; int x; printf(请输入你想要查找的数字n); scanf(%d,&x); if(BinarySearch(a,N,x,i,j) p

10、rintf(找到了:i和j均在%dn,j); else printf(没找到:j=%dti=%dn,j,i);getchar(); getchar(); return 0;3、快速排序问题在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。typedef int Type;void QuickSort (Type a, int p, int r) if (pr) int q=Partition(a,p,r); QuickSort (a,p,q-1); /对左半段排

11、序 QuickSort (a,q+1,r); /对右半段排序 templateint Partition (Type a, int p, int r) int i = p, j = r + 1; Type x=ap; / 将 x的元素交换到右边区域 while (true) while (a+i x); if (i = j) break; Swap(ai, aj); ap = aj; aj = x; return j;*快速排序代码实现:#includevoid sort(int a, int left, int right) if( left = right ) return; int i

12、= left; int j = right; int temp = aleft; while( i != j ) while( temp aj & ij ) j-; if( i=j ) break; ai = aj; i+; while( ai temp & ij ) i+; if( i=j ) break; aj = ai; j-; ai = temp; sort( a, left, i-1 ); sort( a, i+1, right ); int main() int arr7 = 10, 2, 3, 5, 3, 6, 9; int vvv9 = 5, 532, 523, 532, 87

13、, 3124, 76, 4325, 6; int k; sort( arr, 0, 6 ); for(k=0; k7; k+) printf(%d , arrk); printf(n); sort(vvv, 0, 8); for(k=0; k;lchild); /* 访问左子树 */ preorder_recursive(T-;rchild); /* 访问右子树 */ visit(T)这个操作就是对当前数据进行的处理, preorder_recursive(T-;lchild)就是把当前数据变换为它的左子树,访问右子树的操作可以同样理解了. 现在回到我们提出的第二个问题:如何确定转移到哪里继续

14、执行?关键在于以下三个地方:a) 确定对当前数据的访问顺序,简单一点说就是确定这个递归程序可以转换为哪种方式遍历的树结构;b)确定这个递归函数转换为递归调用树时的分支是如何划分的,即确定什么是这个递归调用树的左子树和右子树c)确定这个递归调用树何时返回,即确定什么结点是这个递归调用树的叶子结点. 三.两个例子 好了上面的理论知识已经足够了,下面让我们看看几个例子,结合例子加深我们对问题的认识: 1)例子一: f(n) = n + ; (n = 2); 这个例子相对简单一些,递归程序如下: int f_recursive(int n) int u1, u2, f; if (n 2) f = n

15、+ 1; else u1 = f_recursive(int)(n/2); u2 = f_recursive(int)(n/4); f = u1 * u2; return f; 下面按照我们上面说的,确定好递归调用树的结构,这一步是最重要的.首先,什么是叶子结点 ,我们看到当n 2时f = n + 1,这就是返回的语句,有人问为什么不是f = u1 * u2,这也是一个返回的语句呀?答案是:这条语句是在u1 = exmp1(int)(n/2)和u2 = exmp1(int)(n/4)之后执行的,是这两条语句的父结点. 其次,什么是当前结点,由上面的分析,f = u1 * u2即是父结点.然后,

16、顺理成章的u1 = exmp1(int)(n/2)和u2 = exmp1(int)(n/4)就分别是左子树和右子树了.最后,我们可以看到,这个递归函数可以表示成后序遍历的二叉调用树.好了,树的情况分析到这里,下面来分析一下栈的情况,看看我们要把什么数据保存在栈中,在上面给出的后序遍历的如果这个过程你没非递归程序中我们已经看到了要加入一个标志域,因此在栈中要保存这个标志域;另外,u1,u2和每次调用递归函数时的n/2和n/4参数都要保存,这样就要分别有三个栈分别保存:标志域,返回量和参数,不过我们可以做一个优化,因为在向上一层返回的时候,参数已经没有用了,而返回量也只有在向上返回时才用到,因此可

17、以把这两个栈合为一个栈.如果对于上面的分析你没有明白,建议你根据这个递归函数写出它的递归栈的变化情况以加深理解,再次重申一点:前期对树结构和栈的分析是最重要的,如果你的程序出错,那么请返回到这一步来再次分析,最好把递归调用树和栈的变化情况都画出来,并且结合一些简单的参数来人工分析你的算法到底出错在哪里. 2)例子二快速排序算法递归算法如下: void swap(int array, int low, int high) int temp; temp = arraylow; arraylow = arrayhigh; arrayhigh = temp; int partition(int arr

18、ay, int low, int high) int p; p = arraylow; while (low high) while (low = p) high-; swap(array,low,high); while (low high & arraylow = p) low+; swap(array,low,high); return low; void qsort_recursive(int array, int low, int high) int p; if(low high) p = partition(array, low, high); qsort_recursive(array, low, p - 1); qsort_recursive(array, p + 1, high); 需要说明一下快速排序的算法: partition函数根据数组中的某一个数把数组划分为两个部分, 左边的部分均不大于这个数,右边的数均不小于这个数,然后再对左右两边的数组再进行划分.这里我们专注于递归与非递归的转换,partition函数在非递归函数中同样的可以调用(其实partition函数就是对当前结点的访问).

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

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