JAVA-二分查找

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。(注意:二分查找的前提是数据必须是一个有序的数据)

 

        /**
         * 递归方式实现二分查找
         */
        public static int doSearch(int[] arr, int value, int min, int max)
        {
            int mid = (min + max) / 2;
            // 如果索引超出范围了还没找到
            // 1.如果找到最左边,即min和max都=0的情况,下一步就是max-1,之后min就大于max,说明未找到
            // 2.如果找到最右边,即min和max都=8的情况,下一步就是min+1,之久min就大于max,说明未找到
            if (min > max)
            {
                return -1;
            }
            else
            {
                if (arr[mid] < value)
                {
                    min = mid + 1;
                    return doSearch(arr, value, min, max);
                }
                else if (arr[mid] > value)
                {
                    max = mid - 1;
                    return doSearch(arr, value, min, max);
                }
                else
                {
                    return mid;
                }
            }
        }
        /**
         * 循环方式实现二分查找
         */
        public static int doSearchByWhile(int[] arr, int value)
        {
            int min = 0;
            int max = arr.length - 1;
            while (min <= max)
            {
                int mid = (min + max) / 2;
                if (arr[mid] > value)
                {
                    max = mid - 1;
                }
                else if (arr[mid] < value)
                {
                    min = mid + 1;
                }
                else
                {
                    return mid;
                }
            }
            return -1;// 如果索引都超出了界限,表示未找到。
        }    

 实现结果如下:

 

posted @ 2022-01-27 10:57  没有童话的鱼  阅读(63)  评论(0编辑  收藏  举报