c - 二进制搜索递归无法正常运行

标签 c binary-search

我编写了一个简单的二进制搜索代码来打印出搜索内容的位置。 当搜索到的元素不在数组中时,它会正确识别并打印出“错误”。 但是,当搜索到的元素实际上在数组中时,打印的是值,而不是位置。你能告诉我我错过了什么吗? 提前致谢

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

int binarysearch(int array[], int low, int max, int search);
int main(void) {
    int array[10]={10,11,12,13,14,15,16,17,18,19};

    int count,search;
    count=sizeof(array)/sizeof(array[0]);

    printf("Enter the number you would like to search\n");
    scanf("%d",&search);

    int result=binarysearch(array,0,count,search);

    if (result>0){
        printf("Element in position %d",result);
    }
    else{
        printf("Error");
    }

}

int binarysearch(int array[], int low, int max, int search){
    if(low<=max){
        int middle=(low+max)/2;

        if(search>array[middle]){
            low=middle+1;
            return binarysearch(array,low,max,search);
        }

        else if(search<array[middle]){
            max=middle-1;
            return binarysearch(array,low,max,search);

        }

        else {
            return search;
        }

    }
    else
    return -1;
}

最佳答案

除了 return middle;(代替 return search)之外,您还应该更改

if (result>=0){
         ^^^^
        printf("Element in position %d",result);
    }

否则即使找到了也总是会错过第0个元素。 (小姐我的意思是结果不会被打印出来)。二进制搜索将按预期工作。

另一件需要注意的事情是在计算 mid 时使用这个来避免溢出

int middle = low + ((max - low) / 2);

最后,使用递归纯粹是浪费。

int binarysearch(int array[], int low, int max, int search) {
    while (low <= max) {
        int middle = low + ((max - low) / 2);
        if (search > array[middle]) {
            low = middle + 1;
        }
        else if (search < array[middle]) {
            max = middle - 1;
        }
        else {
            return middle;
        }
    }

    return -1;
}

关于c - 二进制搜索递归无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852917/

相关文章:

c++ - C/C++ 程序有什么方法可以在 main() 之前崩溃吗?

objective-c - CoreMIDI:坚如磐石的 MIDI 同步

c - 在 main 中调用此函数时,局部变量是否会从内存中删除

algorithm - 使用二进制搜索查找数组中数字的位置

c++ - 二进制搜索给出的结果略有不准确

algorithm - 随机二分查找的期望运行时间

c - 指针数组的不同声明

c - 派生一个不使用自己的内存副本的子进程

c++ - 我的插入方法和binsearch方法有问题吗?

java - Java中两个BigIntegers的关系操作