- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- 高考常用高频词汇精编汇总.doc
- 浮动球阀使用说明书.doc
- 英语四级长篇阅读段落信息匹配题练习3.doc
- 伺服电控报错代码.doc
- 搜索引擎使用方法-google reader.doc
- Nitro PDF Reader使用手册.docx
- Adobe Acrobat 8.1.2 Professional安装及破解.doc
- SPARQL 查询的特点.doc
- map工具基本使用步骤.docx
- Unit 4 Those are eggs教学设计教案.doc
- 2025届福建省长汀一中等六校高三第二次月考试卷含解析.doc
- 2025届广东省东莞市六校高三第二学期期终教学质量监控测试语文试题含解析.doc
- 2025届广东省佛山市南海区石门中学高考模拟最后十套:语文试题(五)考前提分仿真卷含解析.doc
- 2025届福建闽侯第四中学高三下学期学习能力诊断(一模)语文试题含解析.doc
- 2025届北京三中高三下学期4月月考试题含解析.doc
- 2025届广东第二师范学院番禺附中高三下学期升级统测语文试题含解析.doc
- 2025届广东省北京师范大学东莞石竹附属学校高三(下)第2次月考语文试题含解析.doc
- 2025届安徽省铜陵市枞阳县枞阳县浮山中学高三语文试题二模冲刺试题(九)含解析.doc
- 2025届甘肃肃兰州市第五十一中学高三下学期高考仿真模拟语文试题试卷含解析.doc
- 2025届甘肃省临洮县二中高三下期第二次模拟考试语文试题理试题含解析.doc
文档评论(0)