查找过程
数组中的元素按升序排列,想要查找一个数是否在该数组中并输出该元素下标。
首先,先找到数组中的中间元素的下标,将数组分为左右两个表,把要查找的数与中间数作比较。若目标数和中间数相等,则目标数就是中间数,查找成功;若目标数比中间数小,则目标数在中间数左边的表中;若目标数比中间数大,则目标数在中间数右边的表中。然后,在确定的那一侧表中再找出中间数下标,进行上述比较,一直重复,直至找到目标数下标,或者没有子表可划分。
举例
arr数组元素:10,11,12,13,14,15,16,17,18,19,20
要找到17这个数字的下标:
第一轮折半:
先找出中间元素下标:(0+10)/2=5 ,将数组分为左右两个表
将arr[5]和17比较:arr[5]=15<17 , 说明17在中间元素15的右边
接下来在右边的表中折半查找。
第二轮折半:
先找出中间元素下标:(6+10)/2=8 ,将表分为左右两个表
将arr[8]和17比较:arr[8]=18>17 , 说明17在中间元素18的左边
接下来在左边的表中折半查找。
第三轮折半:
先找出中间元素下标:(6+7)/2=6 ,将表分为左右两个表
将arr[6]和17比较:arr[6]=16<17 , 说明17在中间元素16的右边
接下来在右边的表中折半查找。
第四轮折半:
先找出中间元素下标:(7+7)/2=7 ,将表分为左右两个表
将arr[7]和17比较:arr[7]=17=17
查找成功,下标为7。
注意折半查找的数组必须是有序数组
Java代码
public static void main(String[] args) {
int[] arr={10,11,12,13,14,15,16,17,18,19,20};
//找出arr数组中的17,返回下标(index)
int index=arrayBinarySearch(arr,17);
System.out.println(index==-1 ? "该元素不存在" : "该元素下标为:"+index);
}
/**
* @param arr 被查找的数组(排过序的数组)
* @param dest 目标元素
* @return -1:表示该元素不存在,其他:表示返回该元素下标
*/
public static int arrayBinarySearch(int[] arr, int dest) {
//开始元素下标
int begin=0;
//结束元素下标
int end=arr.length-1;
//只要begin在end左边,就一直循环;begin一旦大于end,就结束循环
while (begin<=end){
//中间元素下标
int mid=(begin+end)/2;
//如果中间元素等于目标元素,成功找到,返回下标mid
if (arr[mid] == dest){
return mid;
}else if (arr[mid] < dest){
//如果中间元素小于目标元素,说明目标元素在中间元素的右边
//开始元素发生改变,结束元素不变
begin=mid+1;
}else {
//如果中间元素大于目标元素,说明目标元素在中间元素的左边
//结束元素发生改变,开始元素不变
end=mid-1;
}
}
//直到while循环结束都没找到,返回-1
return -1;
}
运行结果
该元素下标为:7