小例子:
如果你要在arr={2,4,32,35,45,52,54}中查找4:
a 首先拿4和这个数组中的最中间的数据arr[3]=35进行比较,
由于4<35,所以第二次比较的时候只需要和arr[3]之前的数据进行比较就行,
因为arr[3]之后的数肯定大于4,4肯定不是在arr [3]之后;
b 第二次就在arr[0]和arr[2]之间查找4;
因为arr[1]=4,这样就找到目标数据了;
作者: 风乐 时间: 2013-5-9 14:03
数据是有序的,每次把数据分成两部分,取中间数值为比较点,拿你要比较的数据和他比大小,然后去相对的区域再次查找比较,这样可以每次缩减一半要比较的区域作者: 江大海 时间: 2013-5-9 14:48
我用个例子说一下吧,比如我有一个数组,是1~100之间的,然后要找一个数,78。然后二分法的思路是这样的,先找1~100之间数的一半,就是50五十就是1 100除以2,就是min max除以2,50比value要小,说明value比50大,就是在51到100之间,因为刚好50找过了,然后再找51到100之间的,这样一直循环,假如数组中有这个数就肯定可以找到。假如数组中没有这个数,比如说是25.3,当但是数组中没有,当折半到最大值为26,最小值为24的下一次,就是中间值为25,但是25并不是要找的数,于是26就变成min于是它们再折中,就是26 26除以2,还是26,26比25.3大,于是max就变为26-1就是25但是min确实26,这样就会min大于max,但是这明显不符合逻辑啦,也就是说数组中没有要找的数学,爪机无力,只能说一下我的一个思路,希望能帮到你作者: 逝者轨迹 时间: 2013-5-9 16:45
折半查找 首先要设三个变量(a,b,c),分别保存数组元素的开始、中间和末尾的序号。假设有10个元素,a=0,c=9,b=(a+c)/2=4,接着进行判断:
1.如果序号位b的元素的值与x相等,说明查找到了数据 ,返回序号c
2.如果x小于c角标所在的值,说明要查找的x位于a和b角标之间,b和c之间的元素将不再查找。因此将c的值改为b-1,然后重新查找a与c之间的数据
3.若x大于b角标的值,则要查找的数据位于b和c之间,a和b之间的元素将不再查找。这时a的值改变为b-1,程序重新查找a到c之间的数据
4.如果循环到a>c时还未找到目标数据,则表示此数组中不存在该元素作者: 黑马-雷钊 时间: 2013-5-9 18:57
你好。我在代码上回答了你的问题。你仔细看看:
public static int Search(int[] array,int value)
{
int min = 0;
int max = array.length-1;
int middle;