24/5/17 递归与非递归实现二分查找

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
总结:
二分查找主要是在有序数组中查找目标值并返回下标。
核心思想:
1、获取中间值。
2、用目标值与中间值比较,确定目标值在左区间还是右区间。
3、重复第二步直到找到目标值。
在递归实现中,因为想要实现Recursion_BS函数的不断递归,而需要传入值格式为(arr,left,right,target)所以用一个bs_recur函数做中间值的处理。


提示:以下是本篇文章正文内容,下面案例可供参考

二分查找

1.递归

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ARR_LEN(arr) (sizeof(arr)/sizeof(arr[0]))
/*
递归二分查找
*/
int Recursion_BS(int arr[],int left,int right,int target)
{
    if (left > right) {
        return -1;
    }
    int middle = left + (right - left >> 1);
    int diff = target - arr[middle];
    if (diff>0) {
        return Recursion_BS(arr, middle+1,right, target);//只取右区间递归
    }
    if (diff<0) {
        return Recursion_BS(arr, left,middle-1, target);//只取左区间递归
    }

}
int bs_recur(int arr[], int length, int target) {
    //递归中需要返回(arr, middle+1,right, target)形成递归,用这个函数做传入值的中转
    return Recursion_BS( arr, 0, length - 1,target);
}

int main(void) {
    int target,index;
    printf("输入想要查找的目标值:\n");
    scanf("%d", &target);
    int arr[] = { 1,2,3,4,5,6,7 };
    int length = ARR_LEN(arr);
    
    index = bs_recur(arr,length,target);
    printf("目标值的下标为:%d\n",index);

    return 0;
}

2.非递归

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ARR_LEN(arr) (sizeof(arr)/sizeof(arr[0]))
/*
    循环二分查找
*/
int Search(int num[], int len,int tar) {
    int left, right;
    left = 0;
    right = len - 1;
    
    while (left<=right)//区间有值没找
    {
        //int middle = (left + right) / 2;
        int middle = left + (right - left >> 1);
        //中间查找索引的优化,右操作数代替除2
        
        int diff = tar - num[middle];
        if (diff > 0) {
            left = middle + 1;
        }
        else if (diff < 0) {
            right = middle - 1;
        }
        else
        {
            return middle;
        }
    }
    return -1;
}

int main(void) {
    int target=0;
    printf("输入要查找的目标值\n");
    scanf("%d", &target);
    int num[] = { -1,0,3,5,9,12 };
    int length = ARR_LEN(num);
    int index_target = Search(num, length,target);
    if (index_target == -1)
    {
        printf("数组中没有该查找值");
    }
    else {
        printf("查找的目标值的下标为%d", index_target);
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值