算法与数据结构 二分查找

二分查找,其要求数据序列呈线性结构,也就是经过排序的数据序列。对于没有经过排序的数据序列,可以通过排序算法来进行预排序,然后执行二分查找操作。

二分查找可以明显地提高查找的效率。其算法的操作步骤如下。

首先需要设三个变量lownum、midnum、 highnum, 分别保存数组元素的开始、中间和末尾的序号。假定有10个元素,要查找的数为x ,开始时令lownum=0,highnum=length - 1 =9, midnum =(lownum+highnum)/2=4。接着进行以下判断:

(1)如果序号为midnum的数组元素的值与x相等,表示查找到了数据,返回该序号midnum。
(2)如果x<a[midnum],表示要查找的数据x位于lownum与midnum-1序号之间,就不需要再去查找midnum与highnum序号之间的元素。因此,将highnum变量的值改为midnum-1,重新查找lownum与midnum-1(即highnum变量的新值)之间的数据。

(3)如果x>a[midnum],表示要查找的数据x位于midnum+1与highnum序号之间,就不需要再去查找lownum与midnum序号之间的元素。因此,将lownum变量的值改为midnum-1, 重新查找midnum+1 (即lownum变量的新值)与highnum之间的数据。

(4)逐步循环,如果到lownum>highnum时还未找到目标数据x,则表示数组中无此数据。

从上述算法执行过程可看出,折半查找是一种递归过程。 每折半查找一一次,可使查找范围缩小一半,当查找范围缩小到只剩下一个元素, 而该元素仍与关键字不相等,则说明查找在最坏的情况下,折半查找所需的比较次数为(nlog),其查找效率比顺序查找法要快。

:以上原理适用于迭代和递归方法

这里提供三种实现方法:

  1. 迭代方法
 public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        //迭代
        int key =6;
        int index = erfenSearch(arr,key);
        System.out.println("查找的数位于序列第" + index +"位");
    }

        private static int erfenSearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;
        while(low <= high) {
           int mid = (low + high) / 2;
           if (arr[mid] < key){
                low = mid + 1;
            }else {
                high = mid - 1;
            }
            if (arr[mid] == key){
               return mid;
            }
        }return -1;
    }
//输出结果
查找的数位于序列第5
  1. 递归方法(这里是分治的思想)
public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int key = 5;
        int index = erfenSearch(arr,key,0,arr.length - 1);
        System.out.println("查找的数位于序列第" + index +"位");
    }

    private static int erfenSearch(int[] arr, int key, int low, int high) {
        if (low > high) {
            return -1;
        }
        int mid = (low + high) / 2;
        if (arr[mid] == key) {
            return mid;
        }else if (arr[mid] > key){
          return   erfenSearch(arr,key,0,mid - 1);
        }else {
            return erfenSearch(arr,key,mid + 1,arr.length - 1);
        }
    }
//输出结果
查找的数位于序列第5
  1. Arrays.binarySearch()方法。
    Java中的Arrays类提供了一种“binarySearch()”方法,该方法在给定的Array上执行二分查找。此方法将数组和要搜索的键作为参数,并返回键在数组中的位置。如果找不到该键,则该方法返回-1。
public static void main(String args[]) {
        // define an array
        int intArray[] = {1,2,3,4,5,6,7,8,9};
        System.out.println("输入数组 : " + Arrays.toString(intArray));
        // define the key to be searched
        int key = 6;
        System.out.println("\n查找的数为:" + key);
        // call binarySearch method on the given array with key to be searched
        int result = Arrays.binarySearch(intArray, key);
        // print the return result
        if (result < 0)
            System.out.println("\n查找的数不在数列中!");
        else
            System.out.println("\n查找的数在数列的第: " + result + " 位.");
//输出结果

输入数组 : [1, 2, 3, 4, 5, 6, 7, 8, 9]

查找的数为:6

查找的数在数列的第: 5.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值