我的代码段是:
int bs_greaterthan_or_equal(int *a, int key, int low, int high) {
while(low<high) {
int mid = low +(high-low)/2.0;
if(a[mid]<key) {
low = mid + 1;
}
else high = mid;
}
return high;
}
但是即使我搜索的数字大于数组中的最后一个元素,它也会返回最后一个索引
例如a [] = {1,3,10,15,20,25,27} 键= 28 返回7
答案 0 :(得分:0)
但是即使我搜索的数字大于数组中的最后一个元素,它也会返回最后一个索引
因为这就是它的设计目的。从技术上讲,它返回最后一个索引+1。
注意条件:
if(a[mid]<key) {
low = mid + 1;
}
当查找的元素大于(或等于)数组的最后一个元素时,上述条件将始终为true。当您到达最后一个元素本身(其中low
设置为比最后一个索引多一个)时,循环终止。
在示例中搜索键28时,low
被重复更新,因为上述条件始终为true。当mid
等于6时,a[mid]
仍小于28,因此low
设置为mid + 1
,即7。此时,low
和{ {1}}相等(请注意,high
从未修改过),循环终止。该函数返回7。
如果在搜索大于或等于数组中最后一个元素的数字时希望返回某些特定内容(例如-1),则可以按以下方式修改代码。
high
如果数组包含给定键的更大或相等的元素,则int bs_greaterthan_or_equal(int *a, int key, int low, int high) {
int max_limit = high;
while(low<high) {
int mid = low +(high-low)/2.0;
if(a[mid]<key) {
low = mid + 1;
}
else high = mid;
}
return high == max_limit ? -1 : high;
}
将存储其索引。否则,最后high
将等于high
,这意味着搜索过程找不到这样的元素,因此将返回-1。