根据二分法的原理 每次取一个中间值 作比较
写出一个基础代码 接下来对他完善
int main(void)
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
// 定义一个数组 arr,包含 1~9 的元素。
int target = 0;
// 定义一个变量 target,用于存储用户输入的要查找的元素。
printf("请输入想查找的数\n");
scanf_s("%d", &target);
// 提示用户输入要查找的元素,并读入用户输入的值。
int len = sizeof(arr) / sizeof(arr[0]);
// 计算数组的长度。
int left=0;
// 定义变量 left,用于表示数组的左端点。
int right = len - 1;
// 定义变量 right,用于表示数组的右端点。
int mid;
// 定义变量 mid,用于表示二分查找的中间点。
while (left <= right)
{
mid = left + (right-left / 2);
// 计算中间点的位置。
if (target > arr[mid])
{
left = mid+1;
// 如果目标元素比中间元素大,则在右半部分继续查找。
}
else
if (target < arr[mid])
{
right = mid - 1;
// 如果目标元素比中间元素小,则在左半部分继续查找。
}
else
if(target == arr[mid])
{
printf("%d", mid);
// 如果找到目标元素,则输出其下标。
return 0;
// 返回程序运行成功的信号。
}
}
printf("未找到元素");
// 如果没有找到目标元素,则输出提示信息。
return 0;
}
-
在计算
mid
的时候,应该先计算(right - left)
,再除以2,即mid = left + (right - left) / 2
。这样可以避免整除带来的误差。 -
在程序的开头应该增加一个对数组是否为空的判断。如果数组为空,就无法执行二分查找操作。
-
如果查找到了目标元素,应该输出元素的位置(下标),而不是元素本身。可以通过输出
mid
来实现。 -
如果未找到元素,可以输出一个提示信息,让用户知道查找操作失败。
#include <stdio.h>
int main(void) {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int target = 0;
int len = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = len - 1;
int mid;
if (len == 0) {
printf("数组为空,无法查找\n");
return 0;
}
printf("请输入想查找的数:\n");
scanf("%d", &target);
while (left <= right) {
mid = left + (right - left) / 2;
if (target > arr[mid]) {
left = mid + 1;
} else if (target < arr[mid]) {
right = mid - 1;
} else {
printf("目标元素的位置是:%d\n", mid);
return 0;
}
}
printf("未找到元素\n");
return 0;
}
当然也可以使用函数来解答