二分法搜索
二分法搜索适用于有序的线性结构,比如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;
这也正是性能上的一些差距。