赞
踩
就算法而言,我们主要学习的是数学+思维+逻辑+数据结构实现功能,所以我们主要学习是思维也是解决问题的思路,然后用逻辑去实现它。
提示:以下是本篇文章正文内容,下面案例可供参考
在有顺序的数组中,每次取出查找范围内的中间数进行比较,如果大于中间数,则说明要找的数在后面,否则在前面。依次调整开始范围和结束范围即可,只不过查询是从左边开始,查询范围包含起始位不包含截止位。
package com.zrrd.lianxi; public class 二分查找法 { public static void main(String[] args) { int a[]={1,2,3,4,5,6,7,8,9,10}; int i1 = leftErFenFaQuery(a,5); System.out.println("返回的索引位为"+i1); } /** * 寻找左侧边界的二分搜索 * @param shuzu * @param cs * @return */ public static int leftErFenFaQuery(int[] shuzu, int cs) { //校验数组大小 if (shuzu.length == 0) return -1; //定义查询范围起始下角标 int start = 0; //定义查询范围截止下角标 int end = shuzu.length; while (start < end) { /**将查询范围起始位+截止位之和 无符号右移 1 位 * >>> 运算符详解:无符号右移:低位抛弃,高位补0. * 以上举例:0 + 2 = 2 2 >>> 1 * 数字2的二进制吗 0000 0010 * 右移之后的二进制码 0000 0001 (是数字1) **/ int laf = (start + end) >>>1; if (shuzu[laf] == cs) { end = laf; //判断当前数组值 是否 小于查询的参数 } else if (shuzu[laf] < cs) { //小于则下角标+1 start = laf + 1; //判断当前数组值 是否 大于查询的参数 } else if (shuzu[laf] > cs) { end = laf; } } return start; } }
效果截图:
结构图仅供参考:
因为初始化 end = shuzu.length 而不是 shuzu.length - 1 。因此每次循环的「搜索区间」是 [start , end) 左闭右开。while(start < end) 终止的条件是 start== end,此时搜索区间 [start, start) 恰巧为空,所以可以正确终止。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。