【C语言】二分查找

【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 过大就会溢出

image-20230813095622893

2

(2)中间值与目标值进行比较,nums[mid] < k
那么新的查找范围变为 mid 的右区间
把 mid+1 的值赋给 left,即新的查找范围[mid+1,right]
4

(3)求出新的 mid ,发现 nums[mid] = k,找到目标值,返回下标 mid
5

四.代码

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿洵Rain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值