二分查找算法---递归和非递归两种实现(以例题进行讲解)

二分查找算法,递归,非递归实现,注意:二分查找算法使用的前提是数组必须有序,我这里使用的是升序排列,如果大家看的有点迷的话就评论区告诉我,我会更新文章去加一个图形进行演示.

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47278183/article/details/123694534