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

来源:互联网 发布:服务器网络加速 编辑:程序博客网 时间:2024/04/29 19:48

下面是递归的方法:

#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)。

原创粉丝点击