您的位置:首页 > 其它

二分查找

2014-08-05 09:13 218 查看
二分查找

基本思想:



在一个已经排序好的序列查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止.




用伪代码来表示:


left = 0, right = n -1
while (left <= right)
    mid = (left + right) / 2
    case
        x[mid] < t:    left = mid + 1;
        x[mid] = t:    p = mid; break;
        x[mid] > t:    right = mid -1;

return -1;


递归方法

[cpp] view
plaincopyprint?

int BinSearch(int Array[],int low,int high,int key)
// key是要找的值

{

if (low<=high)

{

int mid = (low+high)/2;

if(key == Array[mid])

return mid;

else if(key<Array[mid])

return BinSearch(Array,low,mid-1,key);

else if(key>Array[mid])

return BinSearch(Array,mid+1,high,key);

}

else

return -1;

}



非递归方法

[cpp] view
plaincopyprint?

int BinSearch(int Array[],int SizeOfArray,int key)
// key是要找的值

{

int low=0;


int high=SizeOfArray-1;

int mid;

while (low<=high)

{

mid = (low+high)/2;

if(key==Array[mid])

return mid;

if(key<Array[mid])

high=mid-1;

if(key>Array[mid])

low=mid+1;

}

return -1;

}

[cpp] view
plaincopy

//返回等于b的第一个数

int Bi_Search(int a[],int n,int b)

{


if(n==0)
return -1;


int low = 0;

int high = n-1;

int last = -1;
//用last记录上一次满足条件的下标

while (low<=high)

{

int mid = low +(high-low)/2;

if (a[mid]==b)

{

last = mid;

high = mid -1;

}

else if(a[mid]>b)

high = mid -1;

else

low = mid +1;

}

return last;

}

//返回大于b的第一个数

int Bi_Search1(int a[],int n,int b)

{

if(n<=0)
return -1;


int last = -1;

int low = 0;

int high = n-1;

while (low<=high)

{

int mid = low +(high - low)/2;

if(a[mid]>b)

{

last = mid;

high = mid -1;

}

else if (a[mid]<=b)

{

low =mid +1;

}

}



return last;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: