二分法查找数组元素
要求:数组元素必须有序,从大到小排列,或从小到大按一定的规律进行排列。
利用二分法进行查找。
分析:
这个数组是从小到大进行排列的。数组长度是7,因此所引致的范围是【0,6】。首先将目标与索引值为3的元素进行比较,这里假设aim=20;a[3]=75>aim,按照数组的排列顺序,可以知道,aim应该在索引3的右侧,并且,索引为3的元素并不是我们要找的aim,因此,我们将范围改为【3+1,6】,此时,中间索引为5,然后再将索引为5的元素与aim比较,a[5]=3<aim=20,同样的,根据从小到大的排列顺序,我们要找的aim应该再索引为5的左侧,不包含5,因此范围继续减半。变为【4,5】,中间索引为4,a[4]=22=aim,返回结果。
规律&总结:首先要明确数组的排列顺序(从小到大或从大到小);其次,确定数组的界域,然后根据这个界域,得到中间索引值,将其与目标进行比较:这里要分情况进行讨论,在数组排列顺序确定的条件下,如果中间值大于目标,则重新确定一个界域,同理,中间值小于目标,也要重新确定一个界域。
循环条件的确定:上下界,a<=b(a是可能等于b的,并且当a等于b时,有可能会找到目标对象。
界域的确定:需要有两个条件确定的
- 首先是数组的排列顺序
- 其次是中间索引值与目标的比较结果
代码:
public class Find {
public static int find(int[] array, int aim) {
//初始化边界
int a = 0,b = array.length-1;
//中间索引
int center = (a+b)/2;
int centerValue;
while(a<=b){
centerValue = array[center];
if(centerValue<aim){
//区间应该在center左边
b = center-1;
}
else if(centerValue>aim){
//right
a = center+1;
}
else if(aim==centerValue){
return center;
}
center = (a+b)/2;
}
return -1;
}
public static void main(String[] args) {
int[] array = {100, 90, 80, 75, 22, 3, 2};
int result1 = find(array, 22);
if (result1 == -1) {
System.out.println("22 不存在数组中");
} else {
System.out.println("22 存在数组中,索引值是 " + result1);
}
int result2 = find(array, 50);
if (result2 == -1) {
System.out.println("50 不存在数组中");
} else {
System.out.println("50 存在数组中,索引值是 " + result2);
}
}
}