You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言随机数组排序后二分查找返回位置异常问题求助

问题排查与修复方案

我来帮你梳理这段代码里的问题,正是这些错误导致你总是得到错误的搜索结果:

关键错误点

1. 递归调用未返回结果

在binary_search函数的两个递归分支中,你调用了binary_search但没有将递归的返回值传递给上层调用。这会导致函数执行完递归后,直接走到最后的return -1,完全忽略了递归找到的结果。比如当匹配到元素时,虽然打印了位置,但上层递归还是会返回-1,更严重的是会让整个搜索逻辑混乱。

2. 数组结束边界end赋值错误

在main函数里,你用end = i -1设置搜索的结束索引,但这里的i是main开头声明的未初始化变量(不是打印排序数组循环里的局部i)。未初始化变量的值是随机的,这会让binary_search的ending参数变成非法值,直接破坏搜索的边界逻辑——这很可能就是你总是得到0位置结果的核心原因。正确的结束索引应该是数组长度减1,也就是size - 1。

3. 未处理搜索失败的边界情况

当搜索的元素不在数组中时,递归会持续到strt > ending,此时没有任何处理逻辑,会导致栈溢出,也不会给用户任何提示。

修正后的完整代码

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

int binary_search(int array[], int search, int strt, int ending) {
    // 处理搜索失败的边界情况
    if (strt > ending) {
        printf("Search key not found in array Ferrari\n");
        return -1;
    }

    int middle = (strt + ending) / 2;
    if (search > array[middle]) {
        // 递归调用后返回结果
        return binary_search(array, search, middle + 1, ending);
    } else if (search == array[middle]) {
        printf("Your search key is at position %d in array Ferrari\n", middle + 1);
        return middle;
    } else {
        // 递归调用后返回结果
        return binary_search(array, search, strt, middle - 1);
    }
}

int main() {
    srand(time(NULL));
    int Ferrari[10];
    int size = 10;
    int selection;
    int temporary = 0;
    int start = 0;
    int end = size - 1; // 直接用数组长度设置正确的结束索引
    int i;

    // 生成10个1-100的随机整数
    for (i = 0; i < size; i++) {
        Ferrari[i] = rand() % 100 + 1;
    }

    // 打印初始数组
    printf("\nThe array Ferrari consists of -> ");
    for (i = 0; i < size; i++) {
        printf("%d, ", Ferrari[i]);
    }

    // 冒泡排序数组
    for (int f = 0; f < (size - 1); f++) {
        for (int kk = 0; kk < (size - 1 - f); kk++) {
            if (Ferrari[kk] > Ferrari[kk + 1]) {
                int Te_mP = Ferrari[kk + 1];
                Ferrari[kk + 1] = Ferrari[kk];
                Ferrari[kk] = Te_mP;
            }
        }
    }

    // 打印排序后的数组
    printf("\n\nThe sorted array Ferrari consists of -> ");
    for (i = 0; i < size; i++) {
        printf("%d, ", Ferrari[i]);
    }

    // 输入搜索关键字
    printf("\n\nPlease enter a number to search in the array:\n");
    scanf("%d", &selection);

    temporary = binary_search(Ferrari, selection, start, end);
    return 0;
}

修正说明

  • 在binary_search中,所有递归调用都添加了return,确保递归结果能正确传递回上层。
  • 添加了strt > ending的判断,处理搜索失败的情况,避免栈溢出并给出提示。
  • 在main中直接用end = size - 1设置正确的数组结束索引,避免未初始化变量的问题。

现在运行代码,无论是搜索存在的元素还是不存在的元素,都能得到正确的结果啦~

内容的提问来源于stack exchange,提问作者FAFSHOCK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:58:55