📅  最后修改于: 2020-08-21 10:05:19             🧑  作者: Mango
用Java进行二进制搜索有两种方法。
// Java利用那个Array展示二进制搜索binarySearch().
import java.util.Arrays;
public class GFG {
public static void main(String[] args)
{
int arr[] = { 10, 20, 15, 22, 35 };
Arrays.sort(arr);
int key = 22;
int res = Arrays.binarySearch(arr, key);
if (res >= 0)
System.out.println(key + " 被找到,在index = "
+ res);
else
System.out.println(key + " 无对应元素 ");
key = 40;
res = Arrays.binarySearch(arr, key);
if (res >= 0)
System.out.println(key + " 被找到,在index = "
+ res);
else
System.out.println(key + " 无对应元素");
}
}
输出:
22 被找到,在index = 3
40 无对应元素
// Java代码展示针对ArrayList和LinkedList的二进制所搜binarySearch()
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class GFG
{
public static void main(String[] args)
{
List al = new ArrayList();
al.add(1);
al.add(2);
al.add(3);
al.add(10);
al.add(20);
// 10 在index=3.
int key = 10;
int res = Collections.binarySearch(al, key);
if (res >= 0)
System.out.println(key + " 被找到,在index = "
+ res);
else
System.out.println(key + " 无对应元素");
key = 15;
res = Collections.binarySearch(al, key);
if (res >= 0)
System.out.println(key + " 被找到,在index = "
+ res);
else
System.out.println(key + " 无对应元素");
}
}
输出:
10 被找到,在index = 3
15 无对应元素
如果输入未排序怎么办?
如果输入列表未排序,则结果不确定。
如果有重复该怎么办?
如果有重复项,则不能保证将找到需求项。
Collections.binarySearch如何用于LinkedList?
对于ArrayList这样的“随机访问”列表,此方法以log(n)时间运行。如果指定的列表未实现RandomAccess接口且很大,则此方法将执行基于迭代器的二进制搜索,该搜索执行O(n)复杂度遍历,并以O(log n)元素比较。
两个函数返回的负值的有效值是多少?
该函数返回搜索键的索引(如果包含在数组中)。否则,(-(插入点)– 1)。插入点定义为将键插入数组的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定键,则为a.length。请注意,这保证了当且仅当找到密钥时,返回值才会> = 0。
如何在Java中实现我们自己的二进制搜索?
// Java实现二进制搜索
class BinarySearch
{
// 返回x的index,如果出现在 arr[l..r], 否则返回 -1
int binarySearch(int arr[], int l, int r, int x)
{
if (r>=l)
{
int mid = l + (r - l)/2;
// 如果元素出现在正中间
if (arr[mid] == x)
return mid;
// 如元素小于mid,它只可能在左边的subarray
if (arr[mid] > x)
return binarySearch(arr, l, mid-1, x);
// 否则只可能在右边的subarray
return binarySearch(arr, mid+1, r, x);
}
// 运行到此,说明元素在array不存在
return -1;
}
// 测试代码
public static void main(String args[])
{
BinarySearch ob = new BinarySearch();
int arr[] = {2,3,4,10,40};
int n = arr.length;
int x = 10;
int result = ob.binarySearch(arr,0,n-1,x);
if (result == -1)
System.out.println("元素不存在");
else
System.out.println("元素被找到,index= " +
result);
}
}
输出:
元素被找到,index= 3
Java中是否有任何功能如C++ STL的lower_bound()或upper_bound()?
在Java 9之前,Java中没有此类功能。