算法课程设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
设计题目:二分法查找
专业:软件工程班级:11-2 设计人:王佳贺
山东科技大学
2013年11 月27日
课程设计任务书
学院:信息科学与工程学院专业:软件工程班级:2011-1 姓名:王佳贺
一、课程设计题目:二分法查找
二、课程设计主要参考资料
(1)《算法分析与设计》(第三版)王晓东电子工业出版社2007
(2)
三、课程设计应解决的主要问题
(1)查询数据
(2)
(3)
四、课程设计相关附件(如:图纸、软件等):
(1)
(2)
五、任务发出日期:2013-11-21 课程设计完成日期:2013-11-27 指导教师签字:系主任签字:
指导教师对课程设计的评语
成绩:
指导教师签字:
年月日
1二分法详细设计
1.1二分搜索算法
下面我们考虑一种简单的情况。假设该线性表已经排好序了,不妨设它按照主键的递增顺序排列(即由小到大排列)。在这种情况下,我们是否有改进查找效率的可能呢?
如果线性表里只有一个元素,则只要比较这个元素和x就可以确定x是否在线性表中。因此这个问题满足分治法的第一个适用条件;同时我们注意到对于排好序的线性表L有以下性质:比较x和L中任意一个元素L[i],若x=L[i],则x在L中的位置就是i;如果x
begin
if a>b then return(-1)
else begin
m:=(a+b) div 2;
if x=L[m] then return(m)
else if x>L[m]
then
return(Binary_Search(L,m+1,b,x));
else
return(Binary_Search(L,a,m-1,x));
end;
end;
1.2二分法算法实现与编程
在常规的二分查找法查找到一个符合条件数便会停止,如果数组中存在多个符合条件的数,并不会全部输出,二分查找法(折半查找法)的算法(见附录)
1.3二分法应用举例
1.3.1 用二分法求方程的近似解
问题:一元二次方程可用判别式判定根的存在性,可用求根公式求方程的根.但对于一般的方程,虽然可用零点存在性定理判定根的存在性,而没有公式. 求根:如何求得方程的根呢?
例用二分法求函数f (x) = x3– 3的一个正实数零点(精确到0.1).
由于f (1) = –2<0,f (2) = 5>0,因此可以确定区间[1,2]作为计算的初始区间,用二分法逐步计算,列表如下:
端点或中点的横坐标计算端点或中点的函数
值
定区间
a
= 1,b0 = 2 f(1)= –2,f(2)=5 [1,2]
012
1.5 2
x
+
== f (x0) = 0.375>0 [1,1.5]
11 1.5
1.25 2
x
+
== f (x1) = –1.0469<0 [1.25,1.5]
21.25 1.5
1.375
2
x
+
== f (x2) = –0.4004<0 [1.375,1.5]
31.375 1.5
1.4375
2
x
+
== f (x3) = –0.0295<0 [1.4375,1.5]
41.4375 1.5
1.46875
2
x
+
== f (x4) = 0.1684>0 [1.4375,1.46875]
51.4375 1.46875
1.453125
2
x
+
== f (x5)>0 [1.4375,1.453125]
x
6
= 1.4453125 f (x6)>0 [1.4375,1.4453125] 由上表的计算可知区间[1.4375,1.4453125]的左、右端点精确到0.1所取
的近似值都是1.4,所以1.4可作为所求函数的一个正实数零点的近似值.
2程序测试与运行结果
2.1程序测试过程
1.我们的运行幻境:操作系统:windows XP ,语言环境:VC++ 6.0。
2. 核心代码及调试过程
int main()
{ int L[100],search,pos,len;
cout<<"请输入数组的长度:";
cin>>len;
cout<<"请输入长度为"< for(int i=0;i cout<<"请输入要查找的数:"; cin>>search; pos=binarySearh(L,len,search); if(pos == -1) cout<<"非递归算法没有找到该数"< else cout<<"非递归算法找到该数的位置为:"< pos = binarySearh2(L,0,(len-1),search); if(pos == -1) cout<<"递归算法没有找到该数"< else cout<<"递归算法找到该数的位置为:"< system("pause"); return 0; } int binarySearh(int Arr[],int len,int search){ //二分查找非递归算法函数,返回找到的位置 int low,mid,high; low=0;high=len-1; while(low<=high){ //当low指针不在high指针右边的时候指向循环 mid=(low+high)/2; // 设置查找中点 if(Arr[mid]==search) return mid;//如果找到,返回位置 else if(Arr[mid]>search) high=mid-1; //如果mid指针指向的元素值大于查找元素,令high指针指向mid指针前一个元素