二分查找算法(非递归方式)
首先我们要清楚使用我们的二分查找算法的前提条件:
二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找
二分查找的思路
二分查找会用到递归的思想,当然也有非递归的方式,我是分开来学习了
1.首先确定数组的中间下标mid mid = (left+ right)/2
2.让需要查找的数findValue和我们的arr[mid]比较
如果findValue>arr[mid],往右边递归找
如果findValue<arr[mid],向左边递归查找
如果正好找到就返回
那我们的递归出口(结束条件)是什么
1.找到了,直接返回退出了
2.递归万整个数组,没有找到findValue,也需要结束递归时,当我们的left>right就代表要结束了
那我们的非递归方式是怎么来查找呢
非递归代码
public class BinnarySearchNoRecur {
public static void main(String[] args) {
int arr[] = {
1,3,8,10,11,67,100};
int index = binnarySearch(arr, 11);
System.out.println(index);
}
/**
//二分查找的非递归实现
* @param arr 待查找数组 该数组升序
* @param target 待查找的值
* @return 找到返回对应下标,没找到返回-1
*/
public static int binnarySearch(int[] arr,int target){
int left = 0;
int right = arr.length-1;
while(left<=right){
//可以继续查找
int mid = (left + right) / 2;
if(arr[mid] == target){
return mid;
}else if(arr[mid] > target){
right = mid - 1;//向左边查找
}else{
left = mid + 1;//向右边查找
}
}
return -1;
}
}
我们发现没有以前的向左递归向右递归了,我们是通过了while循环来控制我们的方法一直在进行,动态改变我们的left和right的值,达到递归相同的效果