【发布时间】:2022-01-07 23:49:34
【问题描述】:
我编写了这个简码来在复杂度 O(log n) 的有序数组(从高到低)中查找元素 x 的位置。 n 和 arr 表示数组的边缘。
但是,它似乎无法正常工作。有什么建议吗?
int ex2_1(int *arr, int n, int key)
{
if (n == 0)
return -1;
if (arr[n / 2] == key)
return n / 2;
if (arr[n / 2] > key)
return ex2_1(arr + n / 2 + 1, n - n / 2 - 1, key);
return ex2_1(arr, n / 2, key);
}
对于int arr[] = { 9, 7, 7, 5, 3, 3, 3, 1 };、int n = 8 和int key = 3,当我应该得到5 时,我得到了4。
【问题讨论】:
-
请为您的参数使用更具描述性的名称,而不是隐晦命名的
n。目前尚不清楚n代表什么。当你进行二分搜索时,你应该传递一个范围或界限,而不是一个标量。 -
“不起作用”从来都不是一个好的问题描述。请将完整代码显示为minimal reproducible example。即提供设置测试数据、调用函数并验证结果的
main。还要给出确切的预期结果与实际结果。 -
“它似乎无法正常工作。” 我们知道,否则你不会在这里。它表现出什么行为,与您的预期有何不同。样本输入数据,编码为正确的minimal reproducible example,以及预期结果、实际结果以及迄今为止为推断问题所采取的步骤,对于格式良好的问题很重要。
-
假设键对应于数组的最后一个元素。函数返回什么?在哪个递归深度?那个深度的论点是什么?
标签: c recursion binary-search