算法设计 第一章 递归算法.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计 第一章 递归算法

实验报告 实验目的:理解递归算法的基本思想和递归程序的执行过程,并熟悉编写递归算法。掌握递归算法的思想,对给定的问题能设计出分治算法予以解决。 实验内容:编程实现讲过的例题:二分搜索、合并排序、快速排序。 实验过程: 1.二分搜索: 1.1问题描述 在对线性表的操作中,经常需要查找某一个元素在线性表中的位置。此问题的输入是待查找元素x和线性表L,输出x在L中的位置或者x不在L中的信息。 1.2算法分析 (1)首先将链表中第一个元素给参数low,最后一个元素给参量high; (2)在lowhigh的条件下: 取d=(low+high)/2; 若所查找元素第d个元素:则将d赋值给参量high; 若所查找元素第d个元素:则将d+1赋值给参量high; 继续在low与high的范围内查找;找到则输出。 (3)当不满足 lowhigh的条件时:输出没有查找到此元素。 1.3程序框图 假定要搜索x=9: 1 4 5 7 8 9 10 12 15 22 23 27 32 35 1 4 5 7 8 9 10 8 9 10 ↑ 2. 合并排序 2.1问题描述 假定有一个数组A[1…m]p.q.r是它的三个索引,并且有1=p=qr=m,两个子数组A[p…q] A[q+1…r]各自按升序排列。我们要重新安排A中的元素的位置,使得子数组A[p…r]也按升序排列。 2.2算法思想 ⑴.使用两个指针s.t.初始化时各自指向A[p] A[p+1],再用一个空数组 B[p…r]作暂存器。 ⑵.每一次比较元素A[s].A[t],将小的元素添加到辅助数组B[p…r]中,如果相同就把A[s]添加进去。同时更新指针,若添加是A[s],则s++;若添加是A[t],则t++; ⑶.当条件s=q+1 or t=q+1时过程结束,在前一种情况下把数组A[t…r]中剩余的元素添加到在B中. 在后一种情况下把数组A[s…q]中剩余的元素添加到在B中. ⑷.最后,把数组B[p…q]复制到A[p…r]. 2.3程序框图 如图:给出有序数组两个: 7 8 9 10 7 8 9 10 10 12 15 10 12 15 3. 快速排序 3.1问题描述 假定有一个数组A[1…m].其中的元素为无序排列;我们要重新安排A中的元素的位置,使得子数组A[p…r]也按升序排列。 3.2算法思想 (1)首先将链表中第一个元素给参数low,最后一个元素给参量high; (2)在lowhigh的条件下: 将low与high之间的元素以low元素为轴,比low小的元素交换到low以前;比low大的元素交换到low以后。此时得到一个以low为轴的划分,然后分别对low前和其后的数列再进行划分,直到数列成为单个元素,此时完成排序; (3)程序用递归实现。 3.3程序框图 5 7 1 6 4 8 3 2 ↑ ↑ i j 5 1 7 6 4 8 3 2 ↑ ↑ i j 5 1 4 6 7 8 3 2 ↑ ↑ i j 5 1 4 3 7 8 6 2 ↑ ↑ i j 5 1 4 3 2 8 6 7 ↑ ↑ i j 2 1 4 3 5 8 6 7 ↑ ↑ i j 4.程序源代码: (说明:我是将本试验的的三个小试验放在同一个函数中实现: 首先从文件“data.txt”中读取无序数列存入动态数组中,然后进行快速排序,再读入数据进行合并排序,然后对此有序数列进行二分查找) #includestdio.h #includemath.h #includestdlib.h int *L,*C; int Num; int tag=0; void readindata() { FILE *fpin; int a,i=0; if((fpin=fopen(data.txt,r))==NULL) { printf(Can not open!); exit(0); } while(!feof(fpin)) { fscanf(fpin,%d,a); i++; } Num=i; rewind(fpin); L=(int*)malloc(sizeof(int)*(Num+1)); for(i=1;i=Num;i++) { fscanf(fpin,%d,a); *(L+i)=a; } } int Partition(int low,int high) { in

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档