c语言编程二分查找详解

#include <stdio.h>

//二分查找 升序数组
//data: 查找的目标
//arr : 数组
//start: 开始下标
//end : 结束下标
//返回值: -1 没找到 >= 0 找到数的下标
int find(int data ,int *arr, int start, int end)
{
    if(start > end)
    {//没找到
        return -1;
    }
    else 
    {

        //方式1
        //找中间位置下标
        int i = (start + end) / 2;
        //刚好命中
        if(arr[i] == data) return i;
        //在前面部分
        if( arr[i] > data )  
          return find(data, arr, start, i-1);
        else //在后边部分
          return find(data,arr, i+1, end);
    }
}

//二分查找方式2
//data:要找的数
//arr :数组
//len :数组长度
//返回值: NULL没有找到 非空找到目标的地址
int * find2(int data, int *arr, int len)
{
    if(len <= 0) return NULL;
    int * p = arr + len / 2; 
    if(*p == data) return p;
    if(*p > data) return find2(data,arr, p - arr );
    else return find2(data, p+1, len - (p-arr)-1 );
}


int main()
{
    int arr[]={1,2,5,7,9,11,17,20,30,55,97};
    //int ret = find(20,arr,0,10);
    //printf("ret= %d\n",ret);
    int *p = find2(10,arr,11);
    if(p)
        printf("找到了下标=%ld\n",p-arr);
    else 
        printf("没有找到!\n");
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值