开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 614|回复: 24
收起左侧

[易语言纯源码] 折半(二分)查找的非递归实现

[复制链接]
结帖率:100% (2/2)
发表于 2024-6-28 13:05:06 | 显示全部楼层 |阅读模式   贵州省毕节市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
有序数组每次排除一半的错误选项如果包含重复数据则随缘返回正解之一(重复数据的时候找到的位置就不是唯一的)举例 2的6次方 等于64个成员 其中第一次找到1次 第二次找到2次第三次找到4次 第四次找到8次 第五次找到16次 第六次找到32次 平均每个数第几次被找到的次数在大约5.1次左右 每个数最多多少次被找到 最简单的算法就是数组成员数循环除以2 一直除到小于等于1 除2的次数就是对应的数组成员最多循环多少次一定会被找出 不会大于这个次数而普通的遍历方式的时间复杂度则是((1+成员数)*(成员数/2))/成员数 ((1+64)*(64/2))/64=平均每个数需要循环32.5次才能被定位准确位置 考虑到折半查找里面的计算量 再把重复次数乘以6倍 也才两者相等 也就是说 数组的成员数在50个以上 用折半查找的速度就可以明显的感受到差距本来是拿来搞自定义数据类型排序的 结果逻辑梳理完毕没有任何毛病 你们敢想 数据二[计次]=数据一[计次] 竟然经常不能成功的把自定义的数据各个成员的值赋值过去 这是什么鬼BUG 我打开的方式不对吗数组成员几十上百万每个数都全部查一遍也是秒出 数据越多 和普通的循环遍历速度差距越明显 应付百万级别的数组成员这个写法勉强够用 再多的就要重新捣鼓汇编了坑先挖在这里 有机会再来填坑如果可以解决自定义数据类型的赋值或者交换工作 就捣鼓汇编的写法 搞不定自定义的数据类型赋值 弄出来也没啥用 本身就是为了搞自定义数据类型排序而写的
  
子程序名返回值类型公开备 注
折半查找整数型 返回位置 若含多个 值不唯一
参数名类 型参考可空数组备 注
有序数组双精度小数型仅支持整数小数双精度
cha询数值双精度小数型数组cha询类型必须一致
变量名类 型静态数组备 注
起点整数型 
终点整数型 
游标整数型 
尝试整数型不小心 传入乱序 防止死循环
判断 (有序数组 [1] < 有序数组 [取数组成员数 (有序数组)])
起点 = 1  ' 升序
终点 = 取数组成员数 (有序数组)
判断循环首 (起点 ≤ 终点)
游标 = 右移 (起点 + 终点, 1)
判断 (有序数组 [游标] = cha询数值)
返回 (游标)
判断 (有序数组 [游标] > cha询数值)
终点 = 游标 - 1
起点 = 游标 + 1
如果真 (尝试 > 50)
跳出循环 ()
尝试 = 尝试 + 1
判断循环尾 ()
终点 = 1  ' 降序
起点 = 取数组成员数 (有序数组)
判断循环首 (起点 ≥ 终点)
游标 = 右移 (起点 + 终点, 1)
判断 (有序数组 [游标] = cha询数值)
返回 (游标)
判断 (有序数组 [游标] < cha询数值)
起点 = 游标 - 1
终点 = 游标 + 1
如果真 (尝试 > 50)
跳出循环 ()
尝试 = 尝试 + 1
判断循环尾 ()
返回 (0)  ' 预防用户传入还没排序的数组引发死循环 牺牲20%的性能尝试几十次还没找到则视作:(应该就是不存在) 毕竟2的50次方已经是个天文数字了 一般数组成员达不到这个量级



来自群组: 热心网友

点评

刚刚上厕所拉香香的时候我又思考了一下 失败 返回(0) 乱序 返回(-1) 这样更合理   贵州省毕节市  发表于 2024-6-29 03:49
折半查找的非递归实现 → https://xzt168.lanzouj.com/iP94F22y6qhi   贵州省毕节市  发表于 2024-6-28 13:26
木旦被替换成cha了...不管是升序还是降序 只要可以确保有序 就可以删掉防止死循环的 尝试 相关代码 再提速百分之20 模块就别删 鬼知道用户怎么调用   贵州省毕节市  发表于 2024-6-28 13:11

评分

参与人数 6好评 +1 精币 +7 收起 理由
文西哥 + 1 支持开源~!感谢分享
wa690602724 + 1 感谢分享,很给力!~
qq73s5456 + 1 来回血
財財 + 1 感谢分享,很给力!~
chuanqibuding + 1 + 1 开源精神必须支持~
cqcc + 2 此处应该有鼓励~

查看全部评分


结帖率:75% (3/4)
发表于 2024-6-30 11:21:51 | 显示全部楼层   福建省福州市
https://bbs.125.la/forum.php?mod=viewthread&tid=14815039 我原来自己写还有点Bug  后面抄了其他编程语言大佬的翻成易语言

点评

X÷2 比 X整除\2快 右移 X,1 比X÷2快 不做尝试次数的判断 用户传没有排序的乱序就极大概率死循环退不出 尝试次数大于50了返回(-1)更合理 失败0 乱序-1   贵州省毕节市  发表于 2024-6-30 11:44
巧了...我是打算搞自定义数据类型排序 一看好多二分是拿递归写的 不方便传数组 递归硬传数组的话 每循环一次要压栈四次 效率比非递归的低   贵州省毕节市  发表于 2024-6-30 11:38
回复 支持 反对

使用道具 举报

结帖率:60% (3/5)
发表于 2024-7-3 01:18:05 | 显示全部楼层   甘肃省兰州市

谢谢,楼主分享
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 17 天

发表于 2024-7-2 22:03:29 | 显示全部楼层   广东省深圳市
学习一下
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 15 天

发表于 2024-7-1 22:30:06 | 显示全部楼层   福建省泉州市
这个的内容很丰富,值得大家学习。
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2024-6-30 09:39:11 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 11 天

发表于 2024-6-30 01:14:45 | 显示全部楼层   浙江省温州市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 15 天

发表于 2024-6-29 16:30:10 | 显示全部楼层   福建省泉州市
作者的讲解很到位,让我豁然开朗。
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 17 天

发表于 2024-6-29 09:31:59 | 显示全部楼层   广西壮族自治区玉林市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 20 天

发表于 2024-6-29 08:21:22 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表