二分法查找的两种方法

转载自http://blog.csdn.net/h971379154/article/details/48845355

#include <stdio.h>

int BinSearch_Recursion(int Array[],int low,int high,int key);

//递归方法
int BinSearch_Recursion(int Array[],int len,int key)
{
    //如果传入的数组为空或者数组长度<=0那么就返回-1。防御性编程
    if(Array==NULL||len<=0)
        return -1;
    return BinSearch_Recursion(Array,0,len-1,key);
}

int BinSearch_Recursion(int Array[],int low,int high,int key)  /*传入参数分别是找到的数组Array,数组起始位置,数组结束位置,要找的数组*/
{  
    if (low<=high)  
    {  
        //int mid = (low+high)/2;  
		int mid = low + (high - low)/2;//为了防止变量溢出
        if(key == Array[mid])  
            return mid;  
        else if(key<Array[mid])  
            return BinSearch_Recursion(Array,low,mid-1,key);  
        else if(key>Array[mid])  
            return BinSearch_Recursion(Array,mid+1,high,key);  
    }  
    else  
        return -1;  
} 

//非递归方法
int BinSearch(int Array[],int len,int key)  /*传入参数分别是数组地址Array,数组长度len,要找的数据key  返回值为key的位置*/
{  
    //防御性编程
	if(Array==NULL || len <= 0)
		return -1;

    int low=0,high=len-1;  
    int mid;  
    while (low<=high)  
    {  
		//mid = (low+high)/2;  
		mid = low + (high - low)/2;//为了防止变量溢出
        if(key==Array[mid])  
            return mid;  
        if(key<Array[mid])  
            high=mid-1;  
        if(key>Array[mid])  
            low=mid+1;  
    }  
    return -1;  
} 

int main(void)
{
	int a[6]={0,5,20,30,88.102};
	int len = sizeof(a)/sizeof(a[0]);
	int locate=0,locate_recursion;
	locate = BinSearch(a,len,88);
	locate_recursion =BinSearch_Recursion(a,len,20);//根据参数个数选择执行的函数
	printf("%d  %d\n",locate,locate_recursion);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/u014186096/article/details/48845519
今日推荐