Java基础必备---二分法查找

来源:互联网 发布:csgo优化弹道 编辑:程序博客网 时间:2024/06/03 17:10
/*算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想: 假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。 查找 key=58数组arr: | 10 | 16 | 38 | 58 | 118|          ==========================第一次:   | 10 | 16 | 38 | 58 | 118|  //min=0,max=4,mid=2,key>arr[mid],在后半段查找;            ^         ^         ^第二次:   | 10 | 16 | 38 | 58 | 118|  //min=3,max=4,mid=3,key==arr[mid],则key查找到;*/ public static int binarySearch(int[] arr, int key)    {        int min = 0;   //定义小标,并初始化为0;        int max = arr.length-1; //定义大标,并初始化为数组的最后的坐标;        int mid = (min+max)/2;  //定义中标,并初始化值为(min+max)/2,比如int(0+5)/2=2l        while(arr[mid]!=key) //当中标的值与给定的值不一样时,        {            if(key>arr[mid]) //如果给定的值大于中标,            {                min = mid + 1;  //则小标=中标+1;比较后半段            }else if (key<arr[mid]) //如果给定的值小于中标            {                max = mid - 1; //则小标=中标-1;比较后半段            }            if(min>max) //如果小标>大标,没有找到给定的值;            {                return -1; //返回-1,代表Error            }            mid = (min+max)/2; //设置中标=(小标+大标)/2;        }        return mid; //arr[mid]==key,则返回中标;    }    public static void main(String[] args)     {        int[] arr = new int[]{10,16,38,58,118};        int index = binarySearch(arr,58);        System.out.println("index="+index);        index = binarySearch(arr,8);        System.out.println("index="+index);    }#运行结果:index=3index=-1

0 0
原创粉丝点击