-4

基本上,我正在创建一个程序,如果在给定数组中找到该数字,则将输出该数字,如果未找到则输出-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

4

1 回答 1

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 指向,用于与 key 指向的对象匹配的成员。数组中每个成员的大小由 size 指定。

数组的内容应该按照compar引用的比较函数升序排列。

二进制搜索的全部意义在于,如果数组有大小size,则从 position 开始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])更可取。

于 2018-09-21T12:32:53.087 回答