A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈志强 中级黑马   /  2013-3-18 12:37  /  2034 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在Collections这个工具类里面有binarySearch这个方法,功能是使用二分搜索法搜索指定列表,以获得指定对象。返回的值是插入点减一,这是为什么?
同时在毕老师的视频里为了理解这个插入点写了这个方法,也是二分查找,但是毕老师说的这个插入点也就是min所对应的元素,这个如何理解?
public static int halfSreach(List<String>list,String key)
{
        int max,min,mid;
        max=list.size()-1;
        min=0;

        while(min<=max)
        {
                mid=(max+min)>>1;
                String str=list.get(mid);
                int num=str.compareTo(key);
                if(num>0)
                        max=mid-1;
                else if(num<0)
                        min=mid+1;
                else
                        return mid;

        }
        return -min-1;//min就是插入点,这个如何理解呢?
}

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

5 个回复

正序浏览
本帖最后由 michaelchen 于 2013-3-19 15:22 编辑

第一次:min=0  max=4 mid=(0+4)/2=2 arr[2]=3
要插入的数字4大于3,所以min=mid+1=3
这时候min<max,循环继续

第二次,min=3 max=4 mid=(3+4)/2=3 arr[3]=5
要插入的数字4小于5,所以max=mid-1=2
这时min>max,循环跳出,而这个时候min=3,刚好是4
要插入到数组中的位置,所以要插入的位置就是min
回复 使用道具 举报

RE: 关于二分查找,binarysearch

michaelchen 发表于 2013-3-18 17:35
给你举个例子吧,

int[] arr={1,2,3,5,6}

int[] arr={1,2,3,5,6}
想通过二分法把4插入到这个数组中
1. mid=(min+max)/2=2 arr[mid]=3 4>3 min=mid+1=3 max=4 min<max
2. mid=(min+max)/2=3 arr[mid]=5 5>3 max=2 min=3 min>max

你这个有点绕,不知道该怎么看啊,你能不能转换一下或者标注下,谢谢啊
回复 使用道具 举报
本帖最后由 michaelchen 于 2013-3-18 17:36 编辑

给你举个例子吧,

int[] arr={1,2,3,5,6}
想通过二分法把4插入到这个数组中
1.        mid=(min+max)/2=2   arr[mid]=3 4>3 min=mid+1=3 max=4  min<max
2.        mid=(min+max)/2=3   arr[mid]=5 5>3 max=2  min=3 min>max  条件不满足,退出循环,而3正好是要插入到数组中的位置,所以插入的位置是min
回复 使用道具 举报
我不知道该怎么表达了....你仔细看了老毕的视频,仔细推敲了这个算法的过程,应该不难理解.
回复 使用道具 举报
在Collections这个工具类里面有binarySearch这个方法,功能是使用二分搜索法搜索指定列表,以获得指定对象。返回的值是插入点减一,这是为什么?
对象插入后 角标增加了一个  比如 元素插入到角标为8的位置 但是原先角标为8的位置上面还有元素 所以 返回的值是插入点减一
毕老师讲的Min 是整个元素的中间位置 就算你插入了一个元素  里面的元素增加了 Min代表的角标位置也随之变化了 所以 你懂的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马