折半查找法(二分查找)
思路:
定义三个变量分别记录要查找元素的范围最大索引值、最小索引值、中间的索引值,
每次都是使用中间索引值的元素与目标元素比较一次,如果不是我们所需要的元素,
那么缩小查找的范围。
/**
* Author:Liu Zhiyong
* Version:Version_1
* Date:2016年4月7日10:05:53
* Desc:折半查找法(二分查找)
思路:
定义三个变量分别记录要查找元素的范围最大索引值、最小索引值、中间的索引值,
每次都是使用中间索引值的元素与目标元素比较一次,如果不是我们所需要的元素,
那么缩小查找的范围。
*/
class Demo26
{
public static void main(String[] args)
{
// int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 44, 44, 44, 44, 55};//存在问题,这里找到的结果索引是11, 但是事实上索引10是第一个对应的44值,所以这里查找的不一定是第一个出现的值。
int[] arr = {1, 5, 9, 11, 22, 99, 200, 301, 555};
int index = halfSearch(arr, 99);
System.out.println(index);
}
public static int halfSearch(int[] arr, int target){
//定义3个变量分别纪律最大,最小,中间的查找范围值
int min = 0;
int max = arr.length-1;
while(min <= (arr.length-1) && max <= (arr.length-1) && max >= min){
int mid = (min + max) >> 1;//取中间值除以2,右移两位就是除以 2的2次方,右移一位就是除以 2的一次方。
if( target == arr[mid]){
return mid;
}else if(target > arr[mid]){
min = mid + 1;
}else{
max = mid -1;
}
}
return -1;
}
}
图解分析如下: