前言
写一个函数,实现一个整型有序数组的二分查找
一、如何使用二分查找?
二分查找的逻辑如下图所示:
然后依次类推
二、参考代码
最开始的时候mid我是用(left + right) /2来求的,但是考虑到数值可能会溢出的问题,我就将这个代码进行了优化。用left + (right - left) / 2的结果和前者是一样的。
代码如下(示例):
//写一个函数,实现一个整型有序数组的二分查找
#include <stdio.h>
int binary_search(int arr[], int sz, int k)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
return mid;//当arr[mid]=k时,则表示找到了,返回下标
}
}
return -1;
}
int main(void)
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
int k = 5;
int ret = binary_search(arr, sz, k);//用二分查找找下标
//找到了,返回下标
//没找到返回-1(为什么不返回0? 因为数组的下标可能为0,不能有冲突)
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n", ret);
}
return 0;
}
总结
需要注意一点,二分查找只能用于有序数组。这段代码我是用函数写的,函数的功能最好是单一的,所以我将输出放在了主函数里。如果想要写好这段代码,就需要知道如何求数组元素个数,以及二分查找是一个怎样的逻辑。