二分法查找详解

简述:

以下是二分法查找的简要步骤:

  1. 初始化边界:设定数组的左右边界,左边界为数组的起始索引(通常为 0),右边界为数组的结束索引(通常为数组长度减 1)。

  2. 计算中间位置:在每次查找中,计算当前搜索范围的中间位置(mid = (left + right) // 2)。

  3. 比较目标值

    • 如果目标值等于中间位置的值,则查找成功,返回中间位置的索引。

    • 如果目标值小于中间位置的值,则调整右边界为 mid - 1,继续在左半部分查找。

    • 如果目标值大于中间位置的值,则调整左边界为 mid + 1,继续在右半部分查找。

  4. 重复步骤 2 和 3:直到找到目标值或搜索范围为空(即左边界大于右边界),此时查找失败,返回 -1 或其他表示未找到的标志。

    #include <stdio.h>
    
    // 全局变量声明
    int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };  // 已排序的数组
    int key;  // 要查找的关键字
    
    // 二分查找函数
    int binsearch(int left, int right)
    {
        if (left <= right)
        {
            int mid = (left + right) / 2;
            if (a[mid] == key)
                return mid;
            if (key < a[mid])
                return binsearch(left, mid - 1);
            if (key > a[mid])
                return binsearch(mid + 1, right);
        }
        return -1;  // 未找到返回-1
    }
    
    // 打印数组函数
    void printArray(int a[], int size)
    {
        printf("数组内容: ");
        for (int i = 0; i < size; i++)
        {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    int main()
    {
        int size = sizeof(a) / sizeof(a[0]);
    
        // 打印数组
        printArray(a, size);
    
        while (1)
        {
            printf("\n请输入要查找的数字(输入-1退出): ");
            scanf_s("%d", &key);
    
            if (key == -1)
            {
                printf("程序退出\n");
                break;
            }
    
            // 调用二分查找函数
            int result = binsearch(0, size - 1);
    
            // 输出查找结果
            if (result != -1)
            {
                printf("找到数字 %d,位置在索引 %d\n", key, result);
            }
            else
            {
                printf("未找到数字 %d\n", key);
            }
        }
    
        return 0;
    }

    运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值