关注「Java视界」公众号,获取更多技术干货

查找算法专辑(二分查找)未完待续....

一、二分查找

原理:
首先,使用二分法查找的前提是:被查找的数组已排好序
具体实现:
假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.

  • 1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。
  • 2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>a[mid],故确定应在后半段中查找。
  • 3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功,返回查找元素的索引。

如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功,放回-1。
再如下面的,我们查找24这个数的位置:
在这里插入图片描述
时间复杂度:
时间复杂度

  • 1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(logn)
  • 2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)
    空间复杂度:S(n)=n

代码实现:

public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] data = {3, 26, 50, 10, 81, 91, 7, 121, 100, 40, 81};
        // 二分法基于有序数据
        Arrays.sort(data);
        System.out.println(Arrays.toString(data));
        System.out.println("50 的索引:"+binarySearch(data,50));
        System.out.println("16 的索引:"+binarySearch(data, 16));
    }

    public static int binarySearch(int[] data, int value) {
        int low = 0;
        int high = data.length - 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            if (value == data[mid]) {
                return mid;
            }
            if (value > data[mid]) {
                low = mid + 1;
            }
            if (value < data[mid]) {
                high = mid - 1;
            }
        }
        return -1;
    }
}
[3, 7, 10, 26, 40, 50, 81, 81, 91, 100, 121]
50 的索引:5
16 的索引:-1
posted @ 2022-06-25 14:02  沙滩de流沙  阅读(23)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货