写代码可以在整型有序数组中查找想要的数字, 找到了返回下标,找不到返回-1.(折半查找)

##首先找到目标数组的最小下标和最大下标

int left = 0;          //最小下标即为0
int right = sizeof(data) / sizeof(data[0]) - 1;     //求出最大下标   因为sizeof是用来求一个对象(类型,变量,……)所占的内存大小(以字节为单位)。 sizeof(data)求出的是整个数组所占内存大小, sizeof(data[0])是数组中的一个元素所占的内存大小, sizeof(data) / sizeof(data[0])即为数组的长度,数组长度-1即为数组最大下标(别忘了数组下标是从0开始计的).

有了最小下标和最大下标后就可以得出数组中间元素的下标值 即mid = (left + right) / 2,再将要查找的值X与data[mid]比较 ,
如果X>data[mid],将最小坐标更新为mid+1,然后得到新区间【mid+1,right】,再得到一个新的mid,再继续比较X与data[mid]
如果X<data[mid],将最大坐标更新为mid+1,然后得到新区间【left,mid+1】,再得到一个新mid,再继续比较X与data[mid]
如果X=data[mid],就是找到了,就用break 退出循环
循环以上过程,循环条件为left<=right,即只要每次得到的新区间存在,就找出新的mid进行X与data[mid]的比较,当left=right时,就是比较最后一个data[mid]的时候
退出循环后,继续用(left<=right)做一个判断,如果成立则是找到了,如果不成立那就是循环完毕还没出现X=data[mid],即就是目标数组中没有要查找的数。

完整代码如下

#include <stdio.h>

int main(void) {
    int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int toCheck = 0;
    int left = 0;
    int mid=0;
    int right = sizeof(data) / sizeof(data[0]) - 1;
    scanf("%d", &toCheck);
    while (left <= right) {
        mid = (left + right) / 2;
        if (toCheck < data[mid]) {
            right = mid - 1;
        } else if (toCheck > data[mid]) {
            left = mid + 1;
        } else
            break;
    }
    if(left<=right){
        printf("找到了,下标是:%d",mid);
    } else
        printf("没找到");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值