黑马程序员技术交流社区

标题: 二分查找 [打印本页]

作者: 逆袭白富美    时间: 2015-7-10 22:10
标题: 二分查找
public static void main(String[] args)
        {
                int[] arr = {9,12,15,24,36,41,59,68};

                int index = binarySearch(arr,45);
                System.out.println("index="+index);

               
        }
        //二分查找。前提:数组必须是有序的。
        /*
        思路:
        1,通过角标先获取中间角标上元素。
        2,让该元素和要找的数据比较。
        3,如果要找的数大了,缩小范围,要找的范围应该是 中间的角标+1---尾角标。
                如果要找的数小了,要找的范围 头角标---中间角标-1;
        4,不断如此重复,就可以找到元素对应的角标。
        */

        public static int binarySearch(int[] arr,int key)
        {
                //1,定义三个变量,记录头角标,尾角标,中间角标。
                int max,min,mid;
                min = 0;
                max = arr.length-1;
                mid = (max+min)>>1;

                while(arr[mid]!=key)
                {
                        if(key>arr[mid])
                                min = mid + 1;
                        else if(key<arr[mid])
                                max = mid - 1;

                        //判断元素是否存在。
                        if(max<min)
                                return -1;

                        mid = (max+min)>>1;
                }

                return mid;
        }
       
        public static int binarySearch(int[] arr,int key)
        {
                //1,定义三个变量,记录头角标,尾角标,中间角标。
                int max,min,mid;
                min = 0;
                max = arr.length-1;

                while(min<=max)
                {
                        mid = (min+max)>>1;

                        if(key>arr[mid])
                                min = mid + 1;
                        else if(key<arr[mid])
                                max = mid - 1;
                        else
                                return mid;
                }
                return -1;
        }






        //查找。
        /*
        需求;查找一个元素在数组中的第一次出现的位置。
        */
        public static int searchKey(int[] arr,int key)
        {
                //遍历查找。
                for(int x=0; x<arr.length; x++)
                {
                        if(arr[x]==key)
                                return x;
                }
                return -1;//-1,代表的是角标不存在的情况。
        }
作者: 发抖的_DtYJA    时间: 2015-7-10 22:13
好厉害的样子
作者: 曲终烟尽    时间: 2015-7-10 22:18
看到binarySearch好熟悉的感觉,学完忘了,原理记得,然后我找到了Arrays.binarySearch。是一样的。
作者: 房东告诉对方    时间: 2015-7-15 16:00
看不懂啊
作者: jake_liu    时间: 2015-7-15 17:45
又复习了一遍





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2