A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-3-22 09:05  /  774 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

二分查找的条件:是对一组有序数组的查找,在使用二分查找的时候先要对数组进行排序。

二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid把这个数组分为两半,前一半从下标0到mid-1,后一半从mid+1到数组最后一个元素(下标是数组长度减一)。把这个查找的元素key和数组下标为mid的元素进行比较,也就是和中间那个元素进行比较,如果比这个元素的小那么把查找范围缩小到原数组的前一半(把查找下标缩短到0到mid-1),如果比中间mid下标元素大那么范围就是后半部分(下标为mid+1到数组长度减一),这样来回反复取中间比较最后就会定位到要查找元素key的下标。

二分查找有两种实现方式:

非递归实现
递归实现
下面举例非递归实现

public class binarySearch {
        /**
         *  测试类,随机定义个有序数组
         */
        public static void main(String[] args) {
                int[] arr = { 8, 15, 23, 85, 92, 102, 205, 345 };
                System.out.println("非递归查找:" + (binarySearch(arr, 23)));
        }

        /**
         * @param array 操作数组
         * @param key 查找元素
         * @return 元素下标
         */
        public static int binarySearch(int[] array,int key){
                int start=0;
                int middle;//数组的中间下标
                int end=array.length-1;//数组长度
                while(start<=end){
                        middle=(end-start)/2+start;
                        if(key<array[middle]){
                                end=middle-1;
                        }else if(key>array[middle]){
                                start=middle+1;
                        }else{
                                return middle;
                        }
                }
                return -1;
        }
}

下面举例递归实现

public class binarySearch {
        public static void main(String[] args) {
                int[] arr = { 8, 15, 23, 85, 92, 102, 205, 345 };
                //System.out.println("非递归查找:" + (binarySearch(arr, 87)));
                System.out.println("递归查找:" + (binarySearch1(arr, 102,0,arr.length-1)));
        }

   /**
         * @param array 操作数组
         * @param key 查找元素
         * @param start 开始下标
         * @param end 结束下标
         * @return 元素下标
         */
        public static int binarySearch1(int[] array,int key,int start,int end){
                int middle=(end-start)/2+start;
                if(key==array[middle]){
                        return middle;
                }else if(start>=end){
                        return -1;
                }else if(key>array[middle]){
                        return binarySearch1(array,key,middle+1,end);
                }else if(key<array[middle]){
                        return binarySearch1(array,key,start,middle-1);
                }
                return -1;
        }
}

参考:https://blog.csdn.net/qq_38663729/article/details/78946726
---------------------
【转载,仅作分享,侵删】
作者:小志的博客
原文:https://blog.csdn.net/li1325169021/article/details/87213692
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马