首先介绍一下非递归的二分查找,肯定是要用一个循环了,比较注意的地方有一点就是循环的条件要记得带“=”号,一旦只是左边小于右边,那么那些当左右两边相等的时候算出来的点就会找不到,这挺好理解的不再多说,其他的就很简单没有什么特别的,下面是我的代码:
int Binsearch(int a[], int n, int key){
int left = 0;
int right = n - 1;
while (left <= right){
int mid = (left + right) / 2;
if (a[mid] == key){
cout << "找到了!" << endl;
return mid;
}
if (a[mid]>key){
right = mid - 1;
}
if (a[mid] < key){
left = mid + 1;
}
}
cout << "没有找到!" << endl;
return -1;
}
下边说一下递归的二分查找,递归的二分查找的话需要注意一下何时进行递归,大小的比较顺序是有一个要求的,下面我先放代码:
int BinSearch(int a[],int left,int right,int key){
int mid = (left + right) / 2;
if (a[mid] == key){
cout << "找到啦" << endl;
return mid;
}
if (left < right){
if (a[mid] < key){
BinSearch(a, mid+1, right, key);
}
if (a[mid]>key){
BinSearch(a, left, mid-1, key);
}
}
else{
cout << "没有找到" << endl;
return -1;
}
}
因为递归的写法变换了参数,思维也要跟着变换一下下,这里就不需要再带“=”号了,等左右相等的时候我们是不想要调用递归的我们在这个时候是需要进行判断了,所以递归的时候没有写“=”号,而在递归外边一开始相等的判断是要优先放置的这样当经过一次二分直接找到的时候就不会再调用递归了可以节省时间,而当左边不小于右边的时候这个时候如果没有找到的话那肯定是序列里边没有这个key值!
下面是我的主函数测试程序:
int main()
{
int a[] = { 0, 1, 87, 88, 5456 };
//BinSearch(a, 0, 4, 88);
Binsearch(a, 5, 86);
}
因为怕以后自己忘了所以写一篇博客记载一下,肯定不是写的特别好甚至可能会有错误,主要是想大家一起学习,有意见欢迎提出但不要无脑喷我哦!