C中的Bsearch函数无法正常工作

时间:2018-09-21 11:56:43

标签: c bsearch

基本上,我正在创建一个程序,如果在给定数组中找到该数字,则将输出该数字;如果未找到,则输出-1。 (排序数组。)

#include <stdio.h>
#include <stdlib.h>

int cmp(const void*a,const void *b){
    if(*(int*)a-*(int*)b>0) return 1;
    if(*(int*)a-*(int*)b<0) return -1;
    return 0;
}

int main() {
    int n; scanf("%d",&n);
    int a[n];

    for(int i =0;i<n;i++) 
        scanf("%d",a+i);

    for(int i =0;i<n;i++){
        int *item;
        item = (int*)bsearch(&i,a,n,sizeof(int),cmp);
        if(item!=NULL) printf("%d ",i);
        else printf("-1 "); 
    }

    return 0;
}

输入:10

-1 -1 6 1 9 3 2 -1 4 -1

输出: -1 1 2 3 4 -1 6 -1 -1 9

我的输出: -1 -1 -1 3 4 -1 -1 -1 -1 -1

1 个答案:

答案 0 :(得分:0)

https://www.tutorialspoint.com/c_standard_library/c_function_bsearch.htm

  

C库函数void * bsearch(const void * key,const void * base,size_t nitems,size_t size,int(* compar)(const void *,const void *))函数搜索一系列nitems对象,对于与键指向的对象匹配的成员,其初始成员由base指向。数组每个成员的大小由大小指定。

     

根据compar引用的比较函数,数组的内容应按升序排列

二进制搜索的全部要点是,如果数组的大小为size,则从位置size/2开始。如果此元素小于所需的内容,请转到size/2 + size/4,否则转到size/2 - size/4。如果这种方法可行,则需要对数组进行排序。

在此处了解有关二进制搜索的更多信息:https://en.wikipedia.org/wiki/Binary_search_algorithm

正如评论中提到的,scanf("%d",a+i)是正确的,但是scanf("%d",&a[i])是更可取的。