二分查找(参照慕课网)

二分查找(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进行自动排序。

猜你喜欢

转载自blog.csdn.net/li_ce/article/details/88414298