使用C在排序数组中大于给定数字的最小数字的数组索引

时间:2015-11-10 13:41:53

标签: c arrays binary-search-tree

需要找到数字的索引,数组中可能存在也可能不存在。我尝试了以下代码:

#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万的元素数量,相同的代码是否可以工作?

感谢您的帮助。

3 个答案:

答案 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次递归调用。