二分查找(BinarySearch)
1.要求:数列有序且为顺序结构存储
2.描述:
1.先查找数列中间内容,判断是否为想要查找的元素。如果是,则查找完成,如果不是,判断所要查找元素比当前元素大还是比当前元素小,从而判断所要查找的元素的所在区间。
我们在区间端点设置两个哨兵,结束条件为区间端点(大小两个)重合或错位。
2.时间复杂度O(h)=O(log2n)。
3.最坏情况下,二分查找需比较log(2)n次(2为底)。
3.C++代码(以int型为例)
int binarySearch(int arr[], int n, int target) {
int l = 0;
int r = n - 1;//在[l...r]的范围里寻找target
while (l <= r) {//当l==r时,区间[l...r]依然是有效的
int mid = (l + r) / 2;
if (arr[mid] == target)
return mid;
if (target > arr[mid])
l = mid + 1;//target在[mid=1...r]中
else//target<arr[mid]
r = mid - 1;//target在[l...mid-1]中
}
return -1;
}
4.Java代码
public static int binarySearch(Comparable[] arr,int n,Comparable target){
int l = 0, r = n - 1; // 在[l...r]的范围里寻找target
while(l <= r){ // 当 l == r时,区间[l...r]依然是有效的
int mid = l + (r - l) / 2;
if(arr[mid].compareTo(target) == 0) return mid;
if(target.compareTo(arr[mid]) > 0)
l = mid + 1; // target在[mid+1...r]中; [l...mid]一定没有target
else // target < arr[mid]
r = mid - 1; // target在[l...mid-1]中; [mid...r]一定没有target
}
return -1;
}
Java代码备注:Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。