二分查找
简介
二分查找(binary search)又叫折半查找,要求数据序列呈线性结构(排过序的数据序列)。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
功能实现
递归
public static int binarySearch(int[] arr, int start, int end, int hkey){
if (start > end)
return -1;
int mid = start + (end - start)/2; //防止溢位
if (arr[mid] > hkey)
return binarySearch(arr, start, mid - 1, hkey);
if (arr[mid] < hkey)
return binarySearch(arr, mid + 1, end, hkey);
return mid;
}
while循环
public static int binarySearch(int[] arr, int start, int end, int hkey){
int result = -1;
while (start <= end){
int mid = start + (end - start)/2; //防止溢位
if (arr[mid] > hkey)
end = mid - 1;
else if (arr[mid] < hkey)
start = mid + 1;
else {
result = mid ;
break;
}
}
return result;
}
完整代码
取中间值使用:start + (end - start)/2; 可以有效防止数组下标溢出。
public static void main(String[] args) {
//需要查找的数字
int target = 45;
//线性数组
int[] num = {1, 4, 7, 11, 15, 23, 34, 45, 46, 77};
//开始元素序号,中间元素序号,末尾元素序号
int low = 0, mid, high = num.length - 1;
//目标索引位置
int targetIndex = -1;
while (low <= high) {
//获取中间元素序号
//mid = (low + high) / 2; 当数组极大时,(low + high)的值可能为负数,造成数组下标溢出
mid = low + (high - low) / 2;
//判读中间元素是否等于目标数字
if (num[mid] == target) {
targetIndex = mid;
break;
} else if (num[mid] > target) {//中间元素是否大于目标数字
//末尾元素序号重新赋值为mid-1
//low...target...mid...high ==> low...target..high(mid...high)
high = mid - 1;
} else {//中间元素是否小于目标数字
//开始元素序号重新赋值为mid+1
//low...mid...target...high ==> (low...mid)low..target...high
low = mid + 1;
}
}
if (targetIndex == -1) {
System.out.println("目标不存在");
} else {
System.out.println("目标索引是:" + targetIndex);
}
}