查找算法-折半查找(二分查找)

本文介绍了二分查找算法,它运用二分法,将数组分成两部分进行查找,也叫折半查找。该算法要求数列有序且使用顺序存储结构,仅适用于有序序列。通过图解展示查找过程,还指出数据规模大时,折半查找比直接遍历快。最后给出代码思路,先快排使数组有序,再递归调用折半查找函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找算法,又叫折半查找算法,顾名思义,从其名字可见该排序算法运用了二分法进行查找。所谓二分就是将一个数组分成两部分,因为每次都是二分所以又叫折半查找,个人觉得折半很形象。

二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。

二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素。

图解:

以数组

为例,我们查找32。

第一步l=0,r=10,mid=(l+r)/2=5。 

45>32所以现在更新r的值为5

第二步: l=0,r=5,mid=(l+r)/2=2

25<32所以将I的值更新为mid的值。

第三步:l=2,r=5,mid=(l+r)/2=3

 

32=32所以就查找到了。直接输出mid的值即可。

可能因为数据规模较小所以觉得还没有直接遍历查找来得快,但是如果数据规模很大呢

100000个数,这样遍历查找就很麻烦了,所以折半查找还是很快的。

代码:

大概就是先用快排先将无序数组变为有序数组,然后再调用折半查找函数,利用了递归的方法,进行查找。不断的更新中间值mid,以达到差数的目的

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int binarysearch(int *a,int l,int r,int num);
int camp(void *a,void *b)
{
    return *(int *)a-*(int *)b;
}
int main()
{

    int i;

    int n;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    qsort(a,n,sizeof(a[0]),camp);
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);//原数组(顺序排序)
    }
    printf("\n");
    int num;
    scanf("%d",&num);//要查找的数
    int aim=binarysearch(a,0,n,num);//aim为要查找的数再数组中的位置
    printf("%d",a[aim]);


}
int binarysearch(int *a,int l,int r,int num)
{
    int mid;
    mid=(r+l)/2;
    if(a[mid]=num)
    {
        return mid;
    }
    if(a[mid]>num)
    {
        binarysearch(a,l,mid,num);
    }
    if(a[mid]<num)
    {
        binarysearch(a,mid,r,num);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值