第2讲_分治算法和二分搜索算法1.ppt

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

* * * 伪币问题和金块问题引入 2.3 二分搜索技术 本讲内容: (1) 二分搜索技术 分析: 该问题的规模缩小到一定的程度就可以容易地解决 该问题可以分解为若干个规模较小的相同问题 该问题所分解出的各个子问题是相互独立的 利用分解出的子问题的解可以合并为该问题的解 二分搜索技术 给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。 分析:很显然此问题分解出的子问题相互独立,即在a[i]的前面或后面查找x是独立的子问题,因此满足分治法的第四个适用条件。 是将n个元素分为个数大致相同的两半,取a[n/2] 与x进行比较。 如果x=a[n/2],则找到x,算法终止。 如果xa[n/2],只要在数组a的左半部继续搜索x。 如果xa[n/2],只要在数组a的右半部继续搜索x。 具体算法如下: 二分搜索基本思想: 前提条件:有一组数已经按从小到大(或从大到小)排序 例如:输入一个数x=3,在这组数查找是否有x 二分搜索的步骤: 1、确定三个关键下标的初值:left=0, right=8, mid=(left+right)/2; 2、判断要找的数x是否等于a[mid] ① x==a[mid] 找到,结束 xa[mid] 在左半部查找x right=mid-1; mid=(left+right)/2; ③ xa[mid] 在右半部查找x left=mid+1; mid=(left+right)/2; 2 9 8 7 6 5 4 3 1 mid left right a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 2-2 二分搜索算法 right mid left mid 前提条件:有一组数已经按从小到大(或从大到小)排序 例如:输入一个数x=10,在这组数查找是否有x 二分搜索的步骤: 1、确定三个关键下标的初值:left=0, right=8, mid=(left+right)/2; 2、判断要找的数x是否等于a[mid] ① xa[mid] 在右半部查找x left=mid+1; mid=(left+right)/2; 2 9 8 7 6 5 4 3 1 mid left a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 2-2 二分搜索算法---找不到的情况 right mid left mid left left mid #includestdio.h int find(int a[ ], int x, int n);// 函数声明 int main( ) { int a[ ]={1,2,3,4,5,6,7,8,9}; int n,x, b,c; printf(请输入想要查找的数:\n); scanf(%d, b); c=find(a, b,9); // 函数调用 if (c==-1) printf(%d is not found.\n, c); else printf(Find a[%d]=%d\n, c,b); return 0; } 程序代码 2-2 二分搜索算法 int fun(int a[ ], int x, int n) { int mid; while(left=right) { mid=(left+right)/2; if(x==a[mid]) return mid; if(xa[mid]) left=mid+1; else right=mid-1; } return -1; } // 计算中间位置的下标 // 若x等于a[mid],表示找到 // x大则查找数组中较大的一半 // x小则查找数组中较小的一半 // 找到x,返回mid的值 // 没找到时返回-1 程序代码 // 满足条件时进行二分搜索 2-2 二分搜索算法 #includestdio.h #define N 10 int find(int a[ ], int x, int left, int right); int main( ) { int i, x

文档评论(0)

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

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

1亿VIP精品文档

相关文档