所以我有一个二进制搜索代码,可以找到一个数字应放在哪里以维护排序顺序。到目前为止,我已经花了一个半小时的时间试图解决这个问题,所以我可以使用推进器。
如果在数组中找不到值,但是找到它应该放置的位置,我会在方法结束时返回什么值?基本上是一个值,该值表示该数字所属的索引在中间值的+/- 1之内。
这是二元搜索,我不打算改变它,而只是寻找变量返回_____的位置。
private static int bsearch( int[] arr, int count, int key )
{
if (count==0) return -1;
int lo = 0, hi = count - 1, mid;
while(hi >= lo)
{
mid = (lo + hi) / 2;
if(arr[mid] == key) return mid;
if ( key < arr[mid] ) hi = mid-1;
else lo = mid+1;
}
return _____;
}
答案 0 :(得分:4)
大多数方法返回索引的位置否定,放置元素的位置,因此~idx
。
二元搜索假设lo
之前的所有元素都小于key
和hi
的类似物。
如果hi < lo
,则表示hi
设置为mid-1
且mid
等于lo
(因为hi
和{ {1}}最多只有一个)或类似于lo
。因此,必须放置元素的位置为lo
。因此返回:
lo
因此,算法的优化版本是:
return ~lo;
作为测试用例:
private static int bsearch( int[] arr, int count, int key) {
if (count==0) return -1;
int lo = 0, hi = count - 1, mid = hi>>1;
while(hi >= lo) {
mid = (lo + hi) >> 1;
if ( key < arr[mid] ) hi = mid-1;
else if ( key > arr[mid] ) lo = mid+1;
else return mid;
}
return ~lo;
}
给出:
for(int i = 0; i <= 22; i++) {
int r = bsearch(new int[] {2,3,7,9,11,15,21},7,i);
System.out.println(""+i+" -> "+r+" "+(~r));
}
0 -> -1 0
1 -> -1 0
2 -> 0 -1
3 -> 1 -2
4 -> -3 2
5 -> -3 2
6 -> -3 2
7 -> 2 -3
8 -> -4 3
9 -> 3 -4
10 -> -5 4
11 -> 4 -5
12 -> -6 5
13 -> -6 5
14 -> -6 5
15 -> 5 -6
16 -> -7 6
17 -> -7 6
18 -> -7 6
19 -> -7 6
20 -> -7 6
21 -> 6 -7
22 -> -8 7
x -> i j
结果,i
按位为负数(在j
的情况下用作插入索引为负数)。
答案 1 :(得分:1)
return -low - 1;
负数,最多-1。由于mid
(插入点)的范围为0。
<强>返回强>
搜索键的索引,如果它包含在数组中;除此以外, ( - (插入点) - 1)。插入点定义为点 密钥将插入到数组中:索引 第一个元素大于键,或者a.length如果所有元素都在 array小于指定的键。请注意,这可以保证 当且仅当找到密钥时,返回值将> = 0。
答案 2 :(得分:-1)
实际代码为return -1
。但我很困惑你的描述。什么是“如果在数组中找不到值,但找到它应放置的位置?”含义?
可以在数组中找到该值。在while
之前找不到它,这意味着它不在数组中,所以你应该return -1
。