本人学生党一枚。Java学习过程,写这个博客纯属当复习,有什么错误的地方请大家指出来在评论里指点指点我。谢谢
概念:
前提:必须是有序的数据。
基本思想:把一个有序的数据一份为二。然后判断是比目标数据大了还是小了,如果小了往左边的部分找;如果大了往右边的数据找。确定了找的方向后再次把数据一分为二,继续上面的步骤直到找到为止。涉及到了递归的思想。
通俗的讲:每次减少一半,然后确定方向,再次减少一半,直到找到为止。
思路:
1:传入的数据:
- 左边数组最小的范围下标 arr[0]
- 右边数组最大范围下标 arr.length-1 (注意:这个是数组小标,所以要-1)
- 要找的数
- 要找的数组
2:找到数组中间数的下标。就是传入的左右范围除二:(rightIndex+leftIndex)/2
3:通过下标找到中间数
4:设置递归的结束判断,防止递归变成死龟,不会结束直到越界。:(左边的下标要 <= 右边的下标)
5:设置判断二分的条件,分三种情况:
- a:如果要找的数比midVal(中间数)小
- b:如果要找的数比midVal(中间数)小
- c:如果要找的数等于midVal(中间数)
6:在二分条件的判断里加入下一次找的范围,再调用此方法,更改左右范围:
- 情况a:往左边找:find(leftIndex,mindIndex-1,val,arr);
- 情况b:往右边找:find(mindIndex+1,rightIndex,val,arr);
- 情况c:找到目标:System.out.println(“找到下标”+mindIndex);
代码:
package com.test_1;
public class Demo5_4 {
public static void main(String[] args) {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
//创建BinaryFind对象,调用查找方法
BinaryFind bFind = new BinaryFind();
bFind.find(0, arr.length-1, 7, arr);
}
}
//-----------二分法查找(前提是必须是有序数组)
class BinaryFind
{
//1:传入左边最小值 2:传入右边最大值 3:传入要找的数 4:传入要找的数组
public void find(int leftIndex, int rightIndex, int val ,int arr[])
{
//首先找到中间数的下标
int mindIndex = (rightIndex+leftIndex)/2;
//通过下标找到中间数
int midVal = arr[mindIndex];
//总控制递归,防止递归变成死龟
if (leftIndex<=rightIndex)
{
//如果要找的数比midVal(中间数)小
if (midVal>val)
{
//在arr左边数中找(递归)
find(leftIndex,mindIndex-1,val,arr);
//如果要找的数比midVal(中间数)大
}else if (midVal<val)
{
//在arr右边数中找(递归)
find(mindIndex+1,rightIndex,val,arr);
//如果要找的数等于midVal(中间数)
}else if (midVal == val)
{
System.out.println("找到下标"+mindIndex);
}
}
}
}