二分查找---c语言

二分查找的前提得是一个有序的数列

二分查找的原理及实现

        二分查找的原理十分简单,首先需要一个有序的数列,如果没有就是用排序让数列变为有序。

        假如给定一个有序的数组a[10]={0,1,2,3,4,5,6,7,8,9};如果我们需要查找一个元素的位置,就可以使用二分查找,将查找的元素与数组中中间位置元素(中间元素位置(0+9)/2=4,即a[4])比较大小,如果查找元素小于数组中间的元素,则继续从数组的前半部分继续二分查找,直到查找到或者没有这个元素位置,如果查找元素大于数组中间的元素,则继续从数组的后半部分继续二分查找,直到查找到或者没有这个元素位置。

下面我们来看看二分查找的实现。其实我们通过二分查找的操作步骤,可以很轻易地想出二分查找使用递归实现也很方便。下面我们用递归和非递归两种方法来实现二分查找。

递归

#include <stdio.h>

int fun(int*a,int b,int low,int high,int mid)
{
    if(b==a[mid])
        return mid;
    else if(b>a[mid])
    {
        low = mid+1;
        mid = (low+high)/2;
        return fun(a,b,low,high,mid);
    }
    else
    {
        high = mid-1;
        mid = (low+high)/2;
        return fun(a,b,low,high,mid);
    }
    return -1;
}

int main(int argc, char *argv[])
{
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int b,low,high,mid;
    low = 0;
    high = sizeof(a)/4-1;
    mid = (low+high)/2;
    scanf("%d",&b);

   int c=  fun(a,b,low,high,mid);
    printf("%d\n",c);
    return 0;
} 

非递归

#include <stdio.h>

int fun(int*a,int b,int len)
{
    int low=0,mid=0,high=0;
    high=len-1;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(b<a[mid])
        {
            high = mid-1;
        }
        else if(b>a[mid])
        {
            low = mid+1;
        }
        else
        {
            return mid;
        }

    }
    return -1;
}

int main(int argc, char *argv[])
{ 
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int b;
    int len=sizeof(a)/sizeof(int);
    scanf("%d",&b);
    int n = fun(a,b,len);
    printf("%d\n",n);
    return 0;
} 

二分查找的特点及性能分析

二分查找的平均查找长度 ASL 为 ((n+1)log2(n+1))/n-1,有的书上写的是 log2(n+1)-1,或者是 log2n,具体计算比较麻烦,这里就不讨论了。

二分查找有个很重要的特点,就是不会查找数列的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少。所以二分查找的时间复杂度为 O(log2n) 是毫无疑问的。当然,最好的情况是只查找一次就能找到,但是在最坏和一般情况下的确要比顺序查找好了很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值