美文网首页
二分查找及其变种

二分查找及其变种

作者: Mirana_Z | 来源:发表于2017-10-13 15:08 被阅读0次

    二分查找,也叫做折半查找。

    二分查找是在已经拍好序的数组中,每次取中间值与待查关键字比较,如果中间位置的值笔待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到找到了为止,否则序列中没有待查的关键字。

    public static int binarySearch(int[] arr, int k){
            int low = 0;
            int high = arr.length - 1;
            int mid;
            while(low <= high){
                mid = (low + high) >> 1;
                if(arr[mid] == k){
                    return mid;
                }else if(arr[mid] > k){
                    high = mid - 1;
                }else{
                    low = mid + 1;
                }
            }
            return -1;
        }
    

    也可以采用递归实现

    public static int binarySearchByRecursion(int[] arr, int k, int low, int high){
            if(low < high){
                int mid = (low + high) >> 1;
                if(k == arr[mid]){
                    return mid;
                }
                else if(k > arr[mid]){
                    return binarySearchByRecursion(arr, k, mid + 1, high);
                }else{
                    return binarySearchByRecursion(arr, k, low, mid - 1);
                }
            }
            return -1;
        }
    

    变种1,假设数组中存在值相同的元素,找到第一个这个值出现的位置:

    public static int binarySearchFirstElement(int[] arr, int k){
            int low = 0;
            int high = arr.length - 1;
            int mid;
            while(low < high){
                mid = (high + low) >> 1;
                if(arr[mid] < k){
                    low = mid + 1;
                }else{
                    high = mid;
                }
            }
            if(arr[low] != k){
                return -1;
            }else{
                return low;
            }
        }
    

    变种2,条件同上,找到最后一个这个值出现的位置

    public static int binarySearchLastElement(int[] arr, int k){
            int low = 0;
            int high = arr.length - 1;
            int mid;
            while(low < high){
                mid = (high + low + 1) >> 1;
                if(arr[mid] <= k){
                    low = mid;
                }else{
                    high = mid - 1;
                }
            }
            if(arr[low] != k){
                return -1;
            }else{
                return high;
            }
        }
    

    相关文章

      网友评论

          本文标题:二分查找及其变种

          本文链接:https://www.haomeiwen.com/subject/ylyzyxtx.html