java实现二分查找

懒驴 2023年01月03日 1,599次浏览

二分查找

二分查找 :也称折半搜索,对数搜索,是用来在一个有序数组中查找某一元素的算法。

二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用二分查询有两种,一种是使用递归方式,另外一种是不使用递归(while循环)

Java代码实现
↓↓↓↓↓↓↓↓↓↓↓↓↓


/***
 * 二分查找算法
 */
public class BinarySearch {

    /**
     * 1. 使用递归的二分查找
     *title:recursionBinarySearch
     *@param arr 有序数组
     *@param key 待查找关键字
     *@return 找到的位置
     */
    public static int recursionBinarySearch(int[] arr,int key,int low,int high){
        if(key < arr[low] || key > arr[high] || low > high){
            return -1;
        }

        int middle = (low + high) / 2;			//初始中间位置
        if(arr[middle] > key){
            //比关键字大则关键字在左区域
            return recursionBinarySearch(arr, key, low, middle - 1);
        }else if(arr[middle] < key){
            //比关键字小则关键字在右区域
            return recursionBinarySearch(arr, key, middle + 1, high);
        }else {
            return middle;
        }
    }

    /**
     * 2. 不使用递归的二分查找
     * @param arr
     * @param key
     * @return 关键字位置
     */
    public static int commonBinarySearch(int[] arr,int key){
        int low = 0;
        int high = arr.length - 1;
        int middle = 0;			//定义middle

        if(key < arr[low] || key > arr[high] || low > high){
            return -1;
        }
        while(low <= high){
            middle = (low + high) / 2;
            if(arr[middle] > key){
                //比关键字大则关键字在左区域
                high = middle - 1;
            }else if(arr[middle] < key){
                //比关键字小则关键字在右区域
                low = middle + 1;
            }else{
                return middle;
            }
        }
        return -1;		//最后仍然没有找到,则返回-1
    }

    public static void main(String[] args) {
        int[] arr = {3, 7, 8, 12, 22, 22, 33, 44, 58, 66, 77, 88, 97, 101};;
        int key = 12;
	//1.使用递归
        //int position = recursionBinarySearch(arr,key,0,arr.length - 1);
	//2.使用非递归
        int position = commonBinarySearch(arr, key);

        if(position == -1){
            System.out.println("查找的是"+key+",序列中没有该数!");
        }else{
            System.out.println("查找的是"+key+",找到位置为:"+position);
        }
    }

}

运行结果