二分查找
2014-08-05 09:13
218 查看
二分查找
基本思想:
在一个已经排序好的序列查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止.
用伪代码来表示:
递归方法
[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;
}
基本思想:
在一个已经排序好的序列查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止.
用伪代码来表示:
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;
}
相关文章推荐
- 二分查找
- 【bzoj2957】楼房重建 分块+二分查找
- 二分查找
- php:顺序查找和二分查找
- 简单的猜数字游戏,二分查找,杨辉三角
- 二分查找
- 二分查找在C++中的实现
- 补充:二分查找,冒泡,选择
- 二分查找算法1
- 二分查找
- 写正确函数需要注意的地方:二分查找
- c语言归并、选择、直接插入、冒泡、快速、堆排序与顺序、二分查找
- L4:二维数组、数组类、数组值复制、冒泡排序、二分查找
- 【100题】第四十八题 移位数组的二分查找
- 找球号-二分查找
- 二分查找,插值查找,斐波那契查找
- 数据结构实验之查找四:二分查找
- 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber
- C语言 ---- 递归实现二分查找
- HDU5726 GCD 二分查找加RMQ 多校联赛第一场