【C语言】二分查找
一.前言
如果想要查找一个有序数组中的某个数,二分查找是一个不错的选择。
相较于顺序查找,二分查找每次查找都可以去掉一半的范围,在大型数组中,查找效率非常高。
二.思路
确定数组的中间值,与目标值进行比较
中间值 > 目标值,在中间值左区间继续查找
中间值 < 目标值,在中间值右区间继续查找
以上步骤循环,直到找到目标值
三.图解
例:定义一个数组 nums[]={1, 2, 3, 4, 5, 6, 7, 8, 9},寻找数字7,并返回其下标,若找不到数字7则返回“找不到”
(1)用 left 表示数组首元素下标,用 right 表示数组末元素下标,
用 k 表示目标值,
用 mid = left + (right-left)/2 表示中间元素下标
求 mid 不用 (left+right)/2 ,因为 int 是有取值范围的,left + right 过大就会溢出
(2)中间值与目标值进行比较,nums[mid] < k
那么新的查找范围变为 mid 的右区间
把 mid+1 的值赋给 left,即新的查找范围[mid+1,right]
(3)求出新的 mid ,发现 nums[mid] = k,找到目标值,返回下标 mid
四.代码
#include <stdio.h>
int main()
{
int nums[] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;
int ret = -1;
int sz = sizeof(nums) / sizeof(nums[0]); //数组长度
scanf("%d", &k);
int left = 0; //首元素下标
int right = sz-1; //末元素下标
int mid = 0;
while (left <= right) //当 left > right 时,还没找到就停止循环
{
mid = left + (right - left) / 2;
if (nums[mid] < k) //中间值 < 目标值
{
left = mid + 1;
}
else if (nums[mid] > k) //中间值 > 目标值
{
right = mid - 1;
}
else //中间值 = 目标值
{
ret = mid; //返回目标元素下标
break;
}
}
if (ret != -1) //数组的下标不会是-1,只要 ret 不是-1,就说明找到目标值
printf("你要找的数%d的下标为%d\n", k, ret);
else
printf("很遗憾,没找到%d", k);
return 0;
}