猿问

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

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);
    }

}


明月笑刀无情
浏览 590回答 4
4回答

米脂

这就是返回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了吗。

慕容708150

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

慕侠2389804

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

泛舟湖上清波郎朗

这是二分查找,二分查找法就是查询数组中指定值在数组中第一次出现的索引(前提数组必须是有序的).你的代码里start:数组的开始索引end:数组的最大索引如果开始索引小于最大索引,就执行查找,先将开始索引和结束索引做除法,求得中间索引,然后判断中间索引对应的值和你要找的目标值的大小关系:当中间索引的值>目标值,start = 0,end = min - 1 继续循环在中间索引的右边继续找当中间索引的值<目标值,start = min + 1,end = data.length-1 继续循环在中间索引的左边继续找当中间索引的值=目标值, 中间索引就是你要找的值,返回mid就可以了也可以直接调用Arrays的二分查找法
随时随地看视频慕课网APP

相关分类

Java
我要回答