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
相关产品推荐
相关产品推荐

