以下是个人改进之后的二分查找算法:
1.主要思想是在每次对中间值比较之前先进行边界值的比较
2.在数组可以转换成完全二叉树时,时间复杂度为(log2(n))/2 - 1/n,相比传统的二分查找算法时间复杂度减少一半
3.本算法更适用于要查找的值在边界上的情况,此算法为本人对查找边界问题时对二分查找算法改进得到的对于解决特定的问题效率更高
public static int search(int[] arr, int value) {
int index = -1; //指定值的位置,找不到返回-1
int low = 0; //区间段内最小下标,初始时为0
int high = arr.length - 1; //区间段内最大下标,初始时为数组长度-1
//在进入循环之前先对边界值进行比较
if (arr[low] == value) {
index = low;
} else if (arr[high] == value) {
index = high;
} else {
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == value) {
index = mid;
break;
} else if (arr[mid] > value) {
high = mid - 1; //将查找区间改为【low , mid-1】
if (arr[high] == value) { //对刚修改的边界值arr[high]进行判断
index = high;
break;
}
} else {
low = mid + 1; //将查找区间改为【mid+1 , high】
if (arr[low] == value) { //对刚修改的边界值arr[low]进行判断
index = low;
break;
}
}
}
}
return index;
}
/**
* 教科书上的二分查找(折半查找)算法的实现
* 在数组可以转换成完全二叉树时,时间复杂度为log2(n+1)-1
*/
public static int old_search(int[] arr, int value){
int index = -1; //指定值的位置,找不到返回-1
int low = 0; //区间段内最小下标,初始时为0
int high = arr.length - 1; //区间段内最大下标,初始时为数组长度-1
while(low <= high){ //当low>high时调出循环
int mid = (low + high)/2;
if(arr[mid] == value){
index = mid;
break;
}else if(arr[mid] > value){
high = mid - 1 ; //将查找区间改为【low , mid-1】
}else{
low = mid + 1; //将查找区间改为【mid+1 , high】
}
}
return index;
}
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 6, 7, 12, 32, 34, 56, 67 };
int index = Search.old_search(array, 1);
if (index == -1) {
System.out.println("没有找到");
} else {
System.out.println("在第" + (index + 1) + "个位置");
}
}
}