为了账号安全,请及时绑定邮箱和手机立即绑定

有没有大神看一下代码,新手真的看不懂逻辑。为什么会返回5?

有没有大神看一下代码,新手真的看不懂逻辑。为什么会返回5?

明月笑刀无情 2019-04-20 18:15:14
public class sorted {    public static int binarySearch(int[] data, int target) {         int start = 0;         int end = data.length - 1;         while(start <= end) {             int mid = (start + end )/2;             if(target< data[mid]) {                 end = mid -1;             }else if(target > data[mid]) {                 start = mid +1;             }else {                 return mid;             }         }         return -1;     }     public static void main(String[] args) {         int[] values = {1,2,3,4,5,8,8,8,};         int target = 8;         int a = binarySearch( values,target);         System.out.println(a);     }}
查看完整描述

4 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这就是返回5啊,不然要返回什么……
5是指target的引索值,英文叫index。程序里value为1,2,3,4,5,8,8,8 它的引索值是 0,1,2,3,4,5,6,7,8.
你的这段程序就是用二分法在value里面找target,输出target的引索值。由于target=8,所以找到了第一个8,他的引索是5,所以输出5.
仔细看看,可以带值进去看。
刚开始start=0, end=8-1=7. 由于start小于end,所以执行循环,mid=(0+7)/2=3,因为mid是int型,所以只保留整数部分。
那么data[3]应该就是value里面第4个数,也就是4。那么4<8,所以start=mid+1=3+1=4. 第一次循环结束,由于start4<end7,所以再次进入循环
这时mid=(4+7)/2=5,只保留整数部分。那么data[5]就是value里第六个数,也就是8. 因为data[5]8=target8, 所以进入elise后面的语句。就是return mid。
这不就return了5了吗。

查看完整回答
反对 回复 2019-05-14
?
慕容708150

TA贡献1831条经验 获得超4个赞

额,这个是折半查找,查8,对吧。
一开始和中间第4的值开始比较,也就是8 和 data[3] , 8 > 4
start=mid+1=4,再进行比较,这时候mid=(4+7)/2=5,也就是8和data[5]比较, 8 = 8,return mid,这个时候mid=5

查看完整回答
反对 回复 2019-05-14
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

第一遍查找,mid值为3,进入else if(target > data[mid]) { start = mid +1;}这一句,start变为4;
第二遍查找,mid值为5,进入else { return mid;} 这一句,不就是5了么
}

查看完整回答
反对 回复 2019-05-14
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

这是二分查找,二分查找法就是查询数组中指定值在数组中第一次出现的索引(前提数组必须是有序的).
你的代码里
start:数组的开始索引
end:数组的最大索引

如果开始索引小于最大索引,就执行查找,先将开始索引和结束索引做除法,求得中间索引,然后判断中间索引对应的值和你要找的目标值的大小关系:

当中间索引的值>目标值,start = 0,end = min - 1 继续循环在中间索引的右边继续找
当中间索引的值<目标值,start = min + 1,end = data.length-1 继续循环在中间索引的左边继续找
当中间索引的值=目标值, 中间索引就是你要找的值,返回mid就可以了

也可以直接调用Arrays的二分查找法


查看完整回答
反对 回复 2019-05-14
  • 4 回答
  • 0 关注
  • 589 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信