算法之二分查找【C语言】

本文介绍了使用C语言实现的二分查找算法,详细解析了递归方法的应用。算法的时间复杂度分析指出,最坏情况下二分查找的时间复杂度为O(logn),其中包含了子分支的运行、分支分解及数据查找的时间。通过递归,每个分支的运行时间与分支数量有关,最终得出算法的最优时间复杂度为O(logn)。

下面是递归的方法:

#include<stdio.h>

int binary_search(int array[],int start_p,int end_p,int value)
{
    int middle = -1;
    int position = -1;
    int tmp_position = -1;

    if(start_p < end_p)
    {
        middle = (start_p+end_p)/2;
        if(array[middle] == value)
        {
            position = middle;
            tmp_position = position - 1;
            while(tmp_position >=0 && array[tmp_position] == array[position])
            {
                position = tmp_position;
                tmp_position --;
            }
            return position;
        }
        else if(array[middle] < value)
        {
            return binary_search(array, middle+1,end_p,value);
        }
        else if(array[middle] > value)
        {
            return binary_search(array, start_p, middle,value);
        }
    }
    else if(start_p == end_p)
    {
        if(array[start_p] == value)
        {
            position = start_p;
            tmp_position = position - 1;
            while(tmp_position >=0 && array[tmp_position] == array[position])
            {
                position = tmp_position;
                tmp_position --;
            }
            return position;
        }
        else
        {
            return -1;
        }
    }
    if(start_p > end_p)
    {
        printf("Error: Start_p > End_p\n");
    }
}




int main()
{
    int numbers[10] = {-5,-4,-3,-3,-1,0,1,1,3,4};//数字组
    int search_number;//要查找的数字
    int position = -1;//查找到的位置


    printf("search number = ");
    scanf("%d",&search_number);
    position = binary_search(numbers,0,9,search_number);
    if(position!= -1)
    {
        printf("search success! position: %d.\n",position + 1);
    }
    else
    {
        printf("search fail! There is no such number.\n");
    }


    return 0;
}


二分法的最坏时间复杂度为O(lgn)。

用递归的方法来分析最坏时间复杂度:运行时间包括:1、一个子分支的运行时间,子分支的长度为原有分支的1/2;2、分解分支的时间;3、找到数据的时间。其中1的时间为T(n/2)【假设T为运行时间,n为原有分支的长度】;因为分解只是求中间位置,所以时间为O(1);找到数据的时间显然为O(1)。对于每一个分支来说,本身的运行时间为O(1)【包含分解、查找时间】,所以算法的最坏执行时间与分了几个分支有关系。对于长度为n,分支个数为lgn+1,所以最坏执行时间为O(lgn+1),简化后为O(lgn)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值