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

来源:互联网 发布:最新全国省份数据库 编辑:程序博客网 时间:2024/06/07 01:01

二分法搜索

二分法搜索适用于有序的线性结构,比如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;

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

0 0
原创粉丝点击