黑马程序员技术交流社区
标题:
通宵发问题 数组常见操作-拆半查找的一个小疑惑 回帖有将~
[打印本页]
作者:
李斌
时间:
2012-5-22 00:17
标题:
通宵发问题 数组常见操作-拆半查找的一个小疑惑 回帖有将~
不多说 直接上毕老师源码
import java.util.*;
class ArrayTest4
{
public static void main(String[] args)
{
int[] arr = {2,4,5,7,8,19,32,45};//8
int index = getIndex_2(arr,190);
System.out.println("index="+index);
}
public static int getIndex_2(int[] arr,int key)
{
int min = 0,max = arr.length-1,mid;
while(min<=max)
{
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}
对于最后return min 表示 有点小疑惑 金币奉上 求解释 ~~~~
作者:
谭威
时间:
2012-5-22 01:15
折半查找的基础上插入数字要保证数组的顺序..
第一次折半的时候 mid=(0+7)/2=3,索引3的位置为7,插入的8比7大,那么min就要向右移动一次min=mid+1=4,那么mid=(4+7)/2=5,索引5是19,拿8和19再比较,8比19小,所以max要向左移动max=(mid-1)=(5-1)=4;,现在mid=(min+max)/2=(4+4)/2=4.索引角标为4的数为8,8和8相等了 min=max了这时不能折半,可以直接返回-1,8插入的位置在7的后面,而不是已有8的后面 ,那个位置刚好是min=4,min代表的位置就是你刚好要插入8的位置[4]。
作者:
郭宁
时间:
2012-5-22 01:18
这个我还木有看呢~~~
作者:
郭宁
时间:
2012-5-22 01:19
不回答也给加分~~~ 楼主你太厚道啦{:soso_e116:}
作者:
杨康
时间:
2012-5-22 02:14
这是折半思想查一个数组中的某一个元素的角标为的逆运算,当然必须这个数组是升序数组才能用此方法。当查找素组中的一个元素的时候,最后一行的return是 -1,也就是说通过比较min与max的值,来查找这个元素在数组中的位置,当min>max时候,该元素不存在于该数组中。反过来想,想要插入一个不存在的元素到数组中,也就是当min>max的时候的那个min的值,就是这个元素应该插入的地方。
这两个是属于逆运算。
作者:
何阳
时间:
2012-5-22 02:23
public static int getIndex_2(int[] arr,int key)
{
int min = 0,max = arr.length-1,mid;
while(min<=max)
{
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}
//因为此函数你定义了返回 int,所以必须有返回值
//执行代码 如果min小于max 则不执行while循环,直接返回min
//那什么时候min会小于max呢?你传递的一个空的数组。就是没有这个数组,编译或报错
//因为定义数组必须初始化长度的。报空指针异常。
//这种情况几乎不存在,所以会执行while循环的。写return min的目的是说明这个函数有返回值
//因为你上面定义了要返回int类型的。编译在编译的时候不明确会不会执行while循环,所以你必要
//加一个返回值类型。
作者:
李海
时间:
2012-5-22 14:35
其实 你画一个图的话 你就会非常的清楚 为什么要返回min的值? 答案就是返回的这个min的值是你查找的这个数将要插入到数组中的位置 也就是说 如果 你查找的数组中,有你要查找的数 那我们就返回mid值 此时 这个mid=max+min>>1 并且 min=max 但是 如果 你查找的数组中 没有你要查找的数 那我们就返回 这个将要插入到数组中的位置 也是返回min的值
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2