二分查找(非递归)详解
说明
- 二分查找具有很高的查找效率,但是要求要查找的数组必须是有序的,如果是无序的,在查找前必须对其进行排序,否则会出问题
- 二分查找采用折半查找的思路,时间复杂度为对数阶,每次都判断要查找的值和数组中间值的大小关系
- 如果数组中间值元素等于要查找的值,说明找到,直接返回
- 如果中间值大于目标值,说明要查找的元素在中间值的左边,重置右索引
- 否则要查找的目标值在中间元素的右边,重置左侧索引
- 如果查找完还没有找到,说明没有要查找的值,返回-1
- 二分查找较简单,但很常用,需熟练
- 源码见下
源码及分析
/**
* 使用非递归的形式实现二分查找
* @param arr 要查找的数组
* @param target 要查找的目标值
* @return 返回查找的结果
*/
public static int binarySearchNoRecursion(int[] arr, int target){
//定义左右指针
int left = 0, right = arr.length - 1;
//循环查找
while (left <= right){
//定义中间值索引
int mid = (left + right) / 2;
//如果中间值等于target
if (arr[mid] == target){
return mid;
//否则重置左右指针
}else if (arr[mid] > target){
right = mid - 1;
}else {
left = mid + 1;
}
}
//如果没找到返回-1
return -1;
}