二分法查找(折半查找)的两种写法

 1.循环写法while

    public static int rank(int key,int nums[])
    {
        //查找范围的上下界
        int low=0;
        int high=nums.length-1;
        //未查找到的返回值
        int notFind=-1;
        while(low<=high)
        {
            //二分中点=数组左边界+(右边界-左边界)/2   ( 即:(左边界+右边界)/2 )
            //double强转整数类型,会直接舍弃小数只留整数。
            int mid=low+(high-low)/2;
            
            System.out.println("low:"+low+"      high:"+high);
            System.out.println("二分找中点:"+"mid="+low+"+("+high+"-"+low+")"+"/2="+mid+"\n");
            
            //中间值是如果大于key
            if(nums[mid]>key)
            {
                //证明key在[low,mid-1]这个区间
                //因为num[mid]已经判断过了所以下界要减一
                high=mid-1;
            }else if(nums[mid]<key)
            {
                //证明key在[mid+1,high]这个区间
                //同样判断过mid对应的值要从mid+1往后判断
                low=mid+1;
            }
            else //即:( nums[mid]==key )
            {
                //查找成功
                return mid;
            }
        }
        //未成功
        return notFind;
    }

测试结果:

测试:

int nums[] = {0,1,2,3,4,5,6,7};
Test.rank(7, nums);



打印:

low:0      high:7
二分找中点:mid=0+(7-0)/2=3

low:4      high:7
二分找中点:mid=4+(7-4)/2=5

low:6      high:7
二分找中点:mid=6+(7-6)/2=6

low:7      high:7
二分找中点:mid=7+(7-7)/2=7

2.递归写法

    public static int search1(int num, int low, int high, int a[]) {
        int middle = (high + low) / 2;
        while (low <= high) {
            // 注意等号要有
            if (a[middle] > num) {
                return search1(num, low, middle - 1, a);
            } else if (a[middle] < num) {
                return search1(num, middle + 1, high, a);
            }
            else { //即:( nums[mid]==key )
                return middle;
            }
        }
        return -1;
    }

测试:

int nums[] = {0,1,2,3,4,5,6,7};
Test.search(7,0,nums.length-1,nums);

转载自(我在原文基础上有增加补充):https://blog.csdn.net/dijiaxing1234/article/details/81178097

猜你喜欢

转载自blog.csdn.net/HD243608836/article/details/88872227