算法课程设计说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;如果xL[i],同理我们只要在L[i]的后面查找x即可。无论是在 L[i]的前面还是后面查找x,其方法都和在L中查找x一样,只不过是线性表的规模缩小了。这就说明了此问题满足分治法的第二个和第三个适用条件。很显然此问题分解出的子问题相互独立,即在L[i]的前面或后面查找x是独立的子问题,因此满足分治法的第四个适用条件。于是我们得到利用分治法在有序表中查找元素的算法。function Binary_Search(L,a,b,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>L[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指针前一个元素

相关文档
最新文档