使用二进制搜索在数组中查找数字的位置

时间:2012-11-07 20:02:33

标签: algorithm binary-search

我有一系列数字,比如nums [n]。我必须找到位置'i',使得nums [i]在所有小于关键的整数中最大。 nums已排序。我知道我可以使用线性搜索从i = 0到nums [i]> = key的位置。但我想更快地做到这一点,所以有人能告诉算法所需的二进制搜索吗?

示例:nums [] = {2,4,14,25}和key = 15。因此,我应该是2,因为14是小于15的所有其他整数中的最大整数。

2 个答案:

答案 0 :(得分:3)

请记住,在普通的二进制搜索代码中,使用的低和高变量表示数组的索引,因此您可以轻松地知道位置。

首先要注意是否[0]> =键,因为应该至少有1个元素,而不是用于搜索它的键。

然后继续二进制搜索:取出中间元素,如果此元素是> = key,则丢弃其右边的所有元素,包括它。

但是如果是[mid] <键,则丢弃它左边的所有元素(包括它),并取出现在找到的元素的最大值或此元素。

代码:

    if(a[0]>=key)
    print("Some error message");
    int found=-1;
    int low=0,high=n-1;
    while(low<high)
    {
    int mid=(low+high)/2;
    if(a[mid]>=key)
       high=mid-1;
    else
    {
       low=mid+1;
       found=max(found,a[mid]);
    }

  }

现在您知道在此循环之后,low将等于高,因此打印(低)或打印(高)

答案 1 :(得分:3)

Wayne的方法是正确的,我对代码进行了一些修改。我的代码是用Java编写的。

当a&lt; = nums [mid]时,所有大于或等于key的数字都被丢弃,而high被分配到mid-1。所以当循环结束时,high是第一个小于key或-1的数字。 -1表示给定数组中的数字小于键。

public static int lessThan(int[] nums, int key){
    if(nums == null || nums.length == 0) return -1;
    int low = 0, high = nums.length -1;
    while(low <= high){
        int mid = (low + high) >> 1;
        if(key <= nums[mid]){
            high = mid - 1;
        }else {
            low = mid +1;
        }
    }
    return high;
}