二分查找算法,递归,非递归实现,注意:二分查找算法使用的前提是数组必须有序,我这里使用的是升序排列,如果大家看的有点迷的话就评论区告诉我,我会更新文章去加一个图形进行演示.
1. 递归法
A. 题目描述
给定一个升序数组 {1,7,8,49,55,81,108,555}, 请用二分查找findVal这个数是否在数组中.
若是在数组中,则就输出它对应的下标,若不存在,就输出-1.
在这里我将所有的数据都写s了,如果大家需要输入数据的话,可以做相应的修改
B. 思路分析
1. 首先确定该数组中间元素的下标:
mid=(left+right)/2
2. 然后让需要查找的数和当前位置下标的元素进行大小的比较:
- 如果
findVal>array[mid]
,说明要查找的数在mid位置的右边,因此递归向右查找- 如果
findVal<array[mid]
,说明要查找的数在mid位置的左边,因此递归向左查找- 如果
findVal=array[mid]
,说明要查找的数已经被找到了,所以返回下标就行3. 递归结束的条件
- 找到相应的下标就结束递归
- 递归完整个数组,仍然没有找到findVal,也需要结束递归,条件是当
left>right
就需要退出
C.代码实现
public class BinarySearchRecursion {
/**
*
* @param array 需要查找的数组
* @param left 最左边的下标
* @param right 最右边的下标
* @param findVal 要查找的值
* @return 找到就返回下标,否则返回-1.
*/
public static int binarySearch(int[] array,int left,int right,int findVal){
//在数组中没有找到相应的数据,返回-1.
if (left>right){
return -1;
}
//找中间数据的下标
int mid=(left+right)/2;
//中间下标的元素值为midVal,用来和findVal进行比较
int midVal=array[mid];
if (findVal > midVal){
//说明值在mid的右边,所以向右递归
return binarySearch(array,mid+1,right,findVal);
}else if (findVal < midVal){
//说明值在mid的左边向左递归
return binarySearch(array,left,right-1,findVal);
}else{
//说明找到这个值了,所以返回相应的下标
return mid;
}
}
//对上面算法进行测试
public static void main(String[] args) {
int[] array={
1,7,8,49,55,81,108,555};
int left=0;
int right=array.length-1;
int findVal=555;
int index=binarySearch(array,left,right,findVal);
System.out.println("index="+index);
}
}
2. 非递归法
A. 题目描述
给定一个升序数组 {1,7,8,49,55,81,108,555}, 请用二分查找findVal这个数是否在数组中.
若是在数组中,则就输出它对应的下标,若不存在,就输出-1.
B. 思路分析
1. 用一个while循环进行下标的移动操作(代码中一看就懂)
2. 然后确定该数组中间元素的下标:mid=(left+right)/2
2. 然后让需要查找的数和当前位置下标的元素进行大小的比较:
- 如果
findVal=array[mid]
,说明要查找的数已经被找到了,所以返回下标就行- 如果
findVal<array[mid]
,说明要查找的数在mid的左边,然后将右边边界进行修改:right=mid-1
- 如果
findVal>array[mid]
,说明要查找的数在mid的右边,然后将左边边界进行修改:left=mid+1
3. 循环结束的条件
- 找到相应的下标就结束循环
- 递归完整个数组,仍然没有找到findVal,也需要结束循环,条件是当
left>right
就结束
C. 代码实现
public class BinarySearchNONRecursion {
/**
*
* @param array 需要查找的数组
* @param findVal 需要查找的数据
* @return 返回对应的下标,-1表示没有找到
*/
public static int binarySearch(int[] array,int findVal){
//左边边界下标
int left=0;
//右边边界下标
int right=array.length-1;
//while循环,进行数据的查找
while (left<right){
//中间位置下标
int mid=(left+right)/2;
//相等说明找到了数据,返回下标
if (array[mid] == findVal){
return mid;
}else if (array[mid] > findVal){
//说明要找的值在mid的左边,需要向左边查找,同时修改右边边界
right=mid-1;
}else{
//说明要找的值在mid的右边,需要向右边查找,同时修改左边边界
left=mid+1;
}
}
//没有找到数据,返回-1.
return -1;
}
//对上面算法进行测试
public static void main(String[] args) {
int[] array={
1,7,8,49,55,81,108,555};
int index=binarySearch(array,108);
System.out.println("index="+index);
}
}