二分法的C实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int flag = 0; //定义 flag = 0 假设是找不到
int right = sz-1;
int mid = 0; //千万不要把这个 int mid = (left + right) / 2 写在外面,如果这样mid的值永远不会发生变化,必须写在循环里面
while (left <= right)
{
mid = (left + right) / 2;
//mid = left + (right-left) / 2; //为了避免right和left值非常大引起的错误
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,%d的下标是%d", k, mid);
flag = 1;
break;
}
}
//if (left > right)
//{
// printf("找不到");
//}
//此处判断 找不到 也可以这样写
//if(flag == 0)
if(!flag)
{
printf("找不到");
}
return 0;
}
设计函数实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int bin_search(int arr[], int left, int right, int key)
//arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while (left <= right)
{
mid = left + (right-left) / 2; //为了避免right和left值非常大引起的错误
if (arr[mid] < key)
{
left = mid + 1;
}
else if (arr[mid] > key)
{
right = mid - 1;
}
else
{
printf("找到了,%d的下标是%d", key, mid);
return mid;
}
}
if (left > right)
{
printf("找不到");
}
return -1;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
printf("请输入要查询的数字:");
scanf("%d", &k);
bin_search(arr, 0, 9, k);
return 0;
}
在这两处代码里都有说到 平均值的求法,因为这里有个坑,看以下代码:
#include <stdio.h>
int main()
{
//int a = INT_MAX; 2147483647 整型的最大值
//int a = 2147483646;
//int b = 2147483646;
//printf("(a+b)/2=%d", (a + b) / 2); //Error
int c = 2, d = 4;
printf("(c+d)/2=%d\n", (c + d) / 2); // 正常求值
int a = 2147483646;
int b = 2147483646;
int avg = a + (b - a) / 2;
printf("%d", avg);
return 0;
}
可以发现当a和b的值非常大的时候,其中一个值将接近最大值,两个数求和之和将大于最大值,超出了最大值的极限,则再求平均的话就会出错。