精易论坛

标题: 二分查找 代码 在有序数组里查找目标 [打印本页]

作者: APPLEUFO    时间: 2024-3-17 21:07
标题: 二分查找 代码 在有序数组里查找目标
主要看下面那段02   网上有模版写好的

  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
子程序_二分查找逻辑型     自己写的   真 找到,   假 没有
参数名类 型参考可空数组备 注
参数_寻找者文本型
参数_被寻找文本数组文本型 排序过的
变量名类 型静态数组备 注
局变_开始整数型 
局变_结束整数型 
局变_中间整数型 
局变_开始 = 1
局变_结束 = 取数组成员数 (参数_被寻找文本数组) + 1
局变_中间 = 局变_结束 ÷ 2
循环判断首 ()
如果 (参数_寻找者 = 参数_被寻找文本数组 [局变_中间])
返回 ()


如果 (局变_开始 = 局变_结束)  ' 看看要不要加 大于
跳出循环 ()


' 无动作

如果 (参数_寻找者 < 参数_被寻找文本数组 [局变_中间])  ' '  否则就是大于
局变_结束 = 局变_中间 - 1


局变_开始 = 局变_中间 + 1

局变_中间 (局变_开始 + 局变_结束) ÷ 2
如果真 (局变_中间 > 取数组成员数 (参数_被寻找文本数组))
跳出循环 ()


循环判断尾 ()
返回 ()
子程序名返回值类型公开备 注
子程序_二分查找02整数型  0 没有   其他 找到   
参数名类 型参考可空数组备 注
参数_寻找者文本型
参数_被寻找文本数组文本型 排序过的
变量名类 型静态数组备 注
局变_开始整数型 
局变_结束整数型 
局变_中间整数型 
局变_开始 = 1
局变_结束 = 取数组成员数 (参数_被寻找文本数组)
判断循环首 (局变_开始 ≤ 局变_结束)
' 局变_中间 = (局变_开始 + 局变_结束) ÷ 2
局变_中间 = 局变_开始 ��� (局变_结束 - 局变_开始) ÷ 2  ' 原本是上面这样,为了防止大数相加 整数型溢出改的
如果 (参数_寻找者 = 参数_被寻找文本数组 [局变_中间])
返回 (局变_中间)


如果 (参数_寻找者 < 参数_被寻找文本数组 [局变_中间])  ' '  否则就是大于
局变_结束 = 局变_中间 - 1


局变_开始 = 局变_中间 + 1


判断循环尾 ()
返回 (0)
' ' 网上抄的         https://my.oschina.net/lht007/blog/4705655   来源
' 3、简单的二分查找   ' 简单的二分查找我想大家应该都写过。但是想一次将二分查找写对估计 10 个人里面只有 1 个人能做到。下面给出题目和代码,我们具体来分析一下。
' 题目:在有序的数组a里,找到某个指定的数据value。
' public int bsearch($a, $value) {
' int $low = 0;
' int $high = $a.length - 1;
' while ($low <= $high) {
' int $mid = ($low + $high) / 2;
' if ($a[mid] == $value) {
' return $mid;
' } else if ($a[mid] < $value) {
' $low = $mid + 1;
' } else {
' $high = $mid - 1;
' }
' }
' return -1;
' }
' 上诉代码可以作为一个二分查找的模板代码,我相信你能轻易的看懂这段代码。这里需要强调几个容易出错的地方:
' 1. 循环退出条件:
' 注意是 $low<=$high,而不是 $low
' 2.mid 的取值:
' 实际上,$mid=($low+$high)/2 这种写法是有问题的。因为如果 $low 和 $high 比较大的话,两者之和就有可能会溢出。改进的方法是将 $mid 的计算方式写成 $low+($high-$low)/2。更进一步,如果要将性能优化到极致的话,我们可以将这里的除以 2 操作转化成位运算 $low+(($high-$low)>>1)。因为相比除法运算来说,计算机处理位运算要快得多。
' 3.low 和 high 的更新
' $low=$mid+1,$high=$mid-1。注意这里的 +1 和 -1,如果直接写成 $low=$mid 或者 $high=$mid,就可能会发生死循环。比如,当 $high=3,$low=3 时,如果 a [3] 不等于 value,就会导致一直循环不退出。



作者: ttggnn    时间: 2024-3-17 21:32
感谢分享,很给力!~
作者: 易神    时间: 2024-3-17 22:34
感谢分享,很给力!~
作者: ZHuanR    时间: 2024-3-17 22:54
新技能已get√
作者: renjianhong48we    时间: 2024-3-17 23:11
感谢分享
作者: bianyuan456    时间: 2024-3-17 23:47
已经顶贴,感谢您对论坛的支持!
作者: a3960382663    时间: 2024-3-18 04:21
感谢分享,很给力!~
作者: xjshuaishuai    时间: 2024-3-18 07:39
谢谢分享!
作者: 查过    时间: 2024-3-18 08:00
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 豆豆灰常开心    时间: 2024-3-18 08:05
下个学习一下
作者: year1970    时间: 2024-3-18 08:05
感谢分享
作者: 小虎来了    时间: 2024-3-18 08:22
感谢分享,很给力!~
作者: pshq123    时间: 2024-3-18 08:23

作者: kyo9766    时间: 2024-3-18 10:35
学习一下查找,感谢分享
作者: 396384183    时间: 2024-3-18 11:58
谢谢分享!
作者: wgqxj    时间: 2024-3-18 12:15
谢谢分享
作者: qqmqqg    时间: 2024-3-18 16:57
66666666666666666
作者: zaozi    时间: 2024-3-18 17:27
感谢您对论坛的支持
作者: 447485268    时间: 2024-3-18 17:39
支持开源~!感谢分享
作者: 胖子葛格    时间: 2024-3-18 18:02
感谢大神分享~!
作者: 查过    时间: 2024-3-19 07:12
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 豆豆灰常开心    时间: 2024-3-19 07:17
全都是大佬~
作者: 杨明煜    时间: 2024-3-19 10:04
学习进步!......
作者: 光影魔术    时间: 2024-3-19 10:49
感谢分享源码
作者: pipicool    时间: 2024-3-28 19:47
学习一下
作者: 笨来无一悟    时间: 2024-6-30 12:35
功德无量




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4