Java编程题目-6:二分法搜索

二分法搜索

二分法搜索适用于有序的线性结构,比如java当中的数组、List、队列等。只有是有序的才能通过二分法实现查找,因为需要去判断搜索目标与头尾元素的区间关系。时间复杂度为O(logN/log2),空间复杂度为O(1)。
下面开看看代码实现:

public static int searchByBisection(int[] arr,int target){
        int startIndex = 0;
        int sternIndex = arr.length-1;

        while(startIndex<=sternIndex){
            int middleIndex = (startIndex+sternIndex)/2;
            if(arr[middleIndex]<target){
                startIndex = middleIndex+1;
            }else if(arr[middleIndex]>target){
                sternIndex = middleIndex-1;
            }else{
                return middleIndex;
            }
        }
        return -1;
    }

如果检索成功就返回目标元素的对应的下标,检索不到就返回-1。
实现方式有很多种,但是考虑到代码的简洁、高效的话,还有很多需要修改的地方。
还有一种控制循环的方式,就是使用for循环,循环的最大次数等于时间复杂度,当搜索到目标后可以直接退出循环,返回结果
代码如下:

    public static int searchByBisection(int[] arr, int target) {
        Arrays.sort(arr);// 对数组进行排序处理
        int searchItem;
        int len = arr.length;
        int headIndex = 0;
        int sternIndex = len - 1;
        int midIndex;

        if (len == 0 || arr == null) {
            return -1;
        }
        int n = (int)(Math.log(len)/Math.log(2))+1;
        for(int i=0;i<n;i++){
            midIndex = (headIndex + sternIndex) / 2;
            searchItem = arr[midIndex];
            if (target < searchItem) {
                sternIndex = midIndex;
            } else if (target > searchItem) {
                headIndex = midIndex;
            }else if(target == searchItem){
                return midIndex;
            }else{
                return -1;
            }
        }
        return -1;
    }

这其中一些细节与上一个代码段不一样:

sternIndex = midIndex;
headIndex = midIndex;

这也正是性能上的一些差距。

猜你喜欢

转载自blog.csdn.net/u011314731/article/details/52080015