我的二分查找代码无法定位数组首尾元素,求问题排查
你的二分查找代码问题分析与修复
核心错误点
- 二分查找分支逻辑完全写反:
当num[mid] < key时,目标元素应在右半区间(mid+1到r),但你错误递归到左半区间(l到mid-1),导致右侧元素永远无法被搜索到;反之,num[mid] > key时目标在左半区间,你却递归到右半区间,左侧元素也搜不到。 - 缺失递归终止条件:
未判断l > r的情况(即搜索区间耗尽仍未找到目标),导致Element not found的提示永远不会执行。 - 不必要的未定义行为:
fflush(stdin)是C标准未定义的操作,输入流无需使用该语句,会引发潜在问题。
修复后的完整代码
#include<stdio.h> #define max 50 void binarysearch(int l,int r,int key,int num[]) { // 先判断终止条件:区间耗尽,未找到元素 if(l > r) { printf("Element not found"); return; } int mid = (l + r) / 2; if(num[mid] == key) { printf("Element found at location %d", mid + 1); return; } else if(num[mid] < key) { // 目标在右半区间,递归搜索mid+1到r binarysearch(mid + 1, r, key, num); } else { // 目标在左半区间,递归搜索l到mid-1 binarysearch(l, mid - 1, key, num); } } int main() { int i, key, size, num[max]; printf("Enter size of array : "); scanf("%d", &size); for(i=0; i<size; i++) { printf("Enter the element : "); scanf("%d", &num[i]); } printf("Enter key to search : "); scanf("%d", &key); binarysearch(0, size-1, key, num); return 0; }
额外注意
二分查找的前提是数组必须为升序排列,如果输入数组无序,即使修复代码也可能无法找到目标元素,请确保输入时数组是有序的。
内容的提问来源于stack exchange,提问作者Stew
相关产品推荐
相关产品推荐

