1、二分查找要求输入集合有序,所以好多算法会涉及到排序

2、二分查找效率高,用二分查找最多需要log 2 n步,而简单查找最多需要n步

举例说下,例如1.2.3......1024,二分查找最多需要log2 1024即10次,而普通查找最多需要1024次,发现有100倍的差距,数量越大,越明显

链接:https://pan.baidu.com/s/1V4rsYsFvwS745E05Cj5ZEQ 
提取码:x7y4 
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V5的分享

下面列出二分查找的java代码供参考,两个 不同的区别是,如果输入集合只有一个时,的代码拆分与整合。

/**
 * Created by burns.
 *
 * @author <a href="http://www.esoon-soft.com/">burns</a>
 * @date 2021/03/21 8:58
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 二分查找
 *
 * @ClassName BinarySearch
 * @Author Burns
 * @DAte 2021/3/21 8:58
 */
public class BinarySearch {

    public static void main(String[] args){
        {
            //第一种情况,传入的list为空
            System.out.println("第一种情况------start-------");
            List<Integer> list1 = null;
            int index = binarySearch(list1,0);
            outputInfo(index);
            System.out.println("第一种情况------end-------");
        }


        {
            //第二种情况,传递的list只有一个值
            System.out.println("第二种情况------start-------");
            List<Integer> list2 = new ArrayList<Integer>();
            list2.add(1);
            int index = binarySearch(list2,1);
            outputInfo(index);
            System.out.println("第二种情况------end-------");
        }

        {
            //第三种情况,传递的list有多个值
            System.out.println("第三种情况------start-------");
            List<Integer> list3 = new ArrayList<Integer>();
            list3.add(1);
            list3.add(2);
            list3.add(3);
            list3.add(4);
            list3.add(5);
            int index = binarySearch(list3,3);
            outputInfo(index);
            System.out.println("第三种情况------end-------");
        }

//        其中 第二和第三种情况可以合并在一起,区别是 while (low<high)改成 while (low<=high){

    }

    private static void outputInfo(int index) {
        if(index==-1){
            System.out.println("没找到");
        }else {
            System.out.println("找到了,序列是"+index);
        }
    }

    /**
     * 三种情况分开
     *
     * @Description:
     * @Param: [list, n]
     * @Return: int
     * @Author: Burns
     * @Date: 2021/3/21
     */

    private static int binarySearch(List<Integer> list,int n){
        if(list == null || list.size()==0){
            System.out.println("输入集合为空!");
            return -1;
        }else {

            if(list.size()==1){
                if(n==list.get(0)){
                    return 0;
                }else {
                    System.out.println("没找到!");
                    return -1;
                }
            }else {

                //定义开头和结尾部分要查找的位置序号,list的第一个值是从0开始的,所以high就是list的数量-1
                int low = 0;
                int high = list.size()-1;

                //如果low小于等于high,说明值还没有找到,需要继续找,否则
                while (low<high){
                    int mid = (low+high)/2;
                    //猜测值为中间的值
                    int guess = list.get(mid);
                    //如果猜测值和中间值相等,则返回
                    if(guess==n){
                        return mid;
                    }
                    //如果猜测值比查找值大
                    if(guess>n){
                        high = mid-1;
                    }else {
                        low = mid+1;
                    }
                }
                return -1;
            }
        }
    }


}

 

 

 

/**
 * Created by burns.
 *
 * @author <a href="http://www.esoon-soft.com/">burns</a>
 * @date 2021/03/21 8:58
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 二分查找
 *
 * @ClassName BinarySearch
 * @Author Burns
 * @DAte 2021/3/21 8:58
 */
public class BinarySearch1 {

    public static void main(String[] args) {
        {
            //第一种情况,传入的list为空
            System.out.println("第一种情况------start-------");
            List<Integer> list1 = null;
            int index = binarySearch(list1, 0);
            outputInfo(index);
            System.out.println("第一种情况------end-------");
        }


        {
            //第二种情况,传递的list只有一个值
            System.out.println("第二种情况------start-------");
            List<Integer> list2 = new ArrayList<Integer>();
            list2.add(1);
            int index = binarySearch(list2, 1);
            outputInfo(index);
            System.out.println("第二种情况------end-------");
        }

        {
            //第三种情况,传递的list有多个值
            System.out.println("第三种情况------start-------");
            List<Integer> list3 = new ArrayList<Integer>();
            list3.add(1);
            list3.add(2);
            list3.add(3);
            list3.add(4);
            list3.add(5);
            int index = binarySearch(list3, 3);
            outputInfo(index);
            System.out.println("第三种情况------end-------");
        }

//        其中 第二和第三种情况可以合并在一起,区别是 while (low<high)改成 while (low<=high){

    }

    private static void outputInfo(int index) {
        if (index == -1) {
            System.out.println("没找到");
        } else {
            System.out.println("找到了,序列是" + index);
        }
    }

    /**
     * 三种情况分开
     *
     * @Description:
     * @Param: [list, n]
     * @Return: int
     * @Author: Burns
     * @Date: 2021/3/21
     */

    private static int binarySearch(List<Integer> list, int n) {
        if (list == null || list.size() == 0) {
            System.out.println("输入集合为空!");
            return -1;
        } else {


            //定义开头和结尾部分要查找的位置序号,list的第一个值是从0开始的,所以high就是list的数量-1
            int low = 0;
            int high = list.size() - 1;

            //如果low小于等于high,说明值还没有找到,需要继续找,否则
            while (low <= high) {
                int mid = (low + high) / 2;
                //猜测值为中间的值
                int guess = list.get(mid);
                //如果猜测值和中间值相等,则返回
                if (guess == n) {
                    return mid;
                }
                //如果猜测值比查找值大
                if (guess > n) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return -1;
        }
    }


}

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐