下面是递归的方法:
#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)。