写一个函数, 实现一个整型有序数组的二分查找

二分查找必须知道数组的左右下标, 通常情况下, 数组的左右下标表示如下:

int left = 0;    int right = sizeof(arr) / sizeof(arr[0]) - 1;

若通过函数调用来实现二分查找, 就要进行传参.  需要将数组和所要寻找的值传递给二分查找所对应的函数

然而, 数组在传参的时候, 传过去的是一个数组名(arr), 本质上传过去的确是数组的首元素的地址 (&arr[0])

也就是说, 数组传参会发生降级 --- 变成首元素的地址, 那么函数就会使用一个指针来接收这个地址

这时, 若在函数内部求数组的左右下标的话, sizeof(arr) == 4(在32位系统下, 指针的大小为4个字节), 进而右下标就变成了0

所以, 不能再函数内部计算数组的右下标, 而应该在函数外部就计算好, 然后传参给函数.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Binary_search(int arr[], int k, int sz) {
    int left = 0;
    int right = sz - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] > k) {
            right = mid - 1;
        } else if (arr[mid] < k) {
            left = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}
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 ret = Binary_search(arr, k, sz); // (传参的arr为数组首元素的地址)   若找到了就返回数组下标, 找不到就返回-1
    if (ret == -1) {
        printf("找不到\n");
    } else {
        printf("找到了, 下标是%d\n", ret);
    }
    return 0;
}

程序运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值