需要找到数字的索引,数组中可能存在也可能不存在。我尝试了以下代码:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *lhs, const void *rhs){
return ( *(long long*)lhs - *(long long*)rhs );
}
int main(){
int size = 9;
long long a[] = {16426799,16850699,17802287,18007499,18690047,18870191,18870191,19142027,19783871};
long long x = 17802287;
long long *p = (long long *)bsearch(&x, a, size, sizeof(long long), cmp);
if (p != NULL)
printf("%lld\n", p - a);
return 0;
}
如果数字{,1}}中存在数字17802287,则上述代码有效,但如果a
中的数字不存在,则会失败,例如没有为a
提供任何输出,我想得到索引x=18802288
在这种情况下第5个元素以后元素大于18802288.
此外,实际的数组大小将包含超过400万的元素数量,相同的代码是否可以工作?
感谢您的帮助。
答案 0 :(得分:0)
来自bsearch
的手册页:
bsearch()函数返回指向匹配成员的指针 数组,如果找不到匹配则为NULL。如果有多个 与键匹配的元素,返回的元素未指定。
因此,如果找不到相关元素,函数将返回NULL。如果你想找到大于或等于相关数字的第一个元素,你需要自己动手来做这个。
答案 1 :(得分:0)
可能的解决方案之一可能是:
int i, outcome = -1;
for( i = 0; i < size; i++ )
{
if( x == a[i] )
{
outcome = i;
break;
}
}
printf("%d\n", outcome);
答案 2 :(得分:0)
您需要编写一个大致相同的函数:
bsearch_geq (number array low high)
if low is equal to high return high
let halfway be average of low and high
if array[halfway] is equal to number then return halfway
if array[halfway] is greater than number then
return result of "bsearch_geq number array low halfway"
else
return result of "bsearch_geq number array halfway high"
我认为,这会让你99%的方式,但我会把它作为练习留给读者来弄清楚角落的情况。我能看到的主要是当你只得到两个数字时会发生什么,因为天真的&#34;平均值&#34;可能导致无限递归。
如果您可以在阵列中多次出现相同的号码,那么您需要删除if array[halfway] is equal]" line
。
您应该确保您的解决方案使用tail-recursion来提高效率,但它并不太重要,因为4m数据条目只能进行大约15次递归调用。