【发布时间】:2018-08-10 04:14:27
【问题描述】:
调整迭代二分搜索代码,使其只使用两次比较而不是三个(在 主while循环)。 *注:三个比较在while循环中,两个if语句 在循环内。
#include <stdio.h>
int ItBinarySearch(int arr[], int len, int target) {
int first = 0;
int last = len-1;
while (first <= last){
// Assert: array is sorted
int mid = (first+last) / 2;
if (target == arr[mid])
return 1;
if (target < arr[mid])
last = mid-1;
else first = mid+1;
}
return 0;
}
int main(void){
int arr[6]={0,1,2,3,4,5};
int len=sizeof(arr)/sizeof(arr[0]);
int target = 4;
printf("%d\n",ItBinarySearch(arr,len,target));
}
【问题讨论】:
-
不确定你认为你需要做什么。根据定义,二分搜索需要 O(log2(n)) 次比较。比较是您在任何时候使用 ==、>、数据值(比较 first 和 last 等索引不计算在内)。
-
比较是指比较两件事。我假设在这种情况下,比较是每个
if,每个else每个while,因为您在那里进行比较。我猜老师是想让你重写函数,这样在函数中只能找到两个比较。 -
@LeeDanielCrocker 如果比较第一个和最后一个不算数,那么它不是已经有 2 个比较了吗?一个用于目标 == arr[mid],一个用于目标
-
是的,循环内部有两次比较,循环很可能会运行O(log2(n))次。
-
@Pablo 您的回答似乎与李的不同。我有点困惑。
标签: c binary-search