目录
原理
二分查找从数据集合的中间元素开始。如果目标元素与中间元素相等,搜索成功。如果目标元素小于中间元素,算法会在左侧子数组中继续查找;如果目标元素大于中间元素,算法则在右侧子数组中查找。这个过程一直重复,直到找到目标元素或搜索范围缩小到空集为止。
示例
假设我们有一个有序整数列表:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],现在要查找元素 9。二分查找将首先比较 9 与中间元素 11,由于 9 小于 11,它将继续在左侧子数组 [1, 3, 5, 7, 9] 中查找。然后,它将比较 9 与子数组的中间元素 5,发现 9 大于 5,于是在子数组 [7, 9] 中查找。最终,它找到了元素 9,返回它的位置。
样例
查找一个有序整数列表:[1,2,3,4,5,6,7,8,9],返回目标数的下标。
循环写法
#include<iostream>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,6,7,8,9},left=0,right=8,key;
cout<<"输入要查找的数字:";
cin>>key;
while(1)
{
if(left>right)break;
int mid=(left+right)/2;
if(key<a[mid])right=mid-1;
else if(key>a[mid])left=mid+1;
else {
cout<<"找到了,下标为:"<<mid;
return 0;
}
}
cout<<"没找到";
}
递归写法
#include <iostream>
using namespace std;
int handle(int a[],int key,int left,int right)
{
if(left>right)return -1;
int mid=(left+right)/2;
if(key>a[mid])handle(a,key,mid+1,right);
else if(key<a[mid])handle(a,key,left,mid-1);
else return mid;
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
int key;
cout<<"输入要查找的数字:";
cin>>key;
if(handle(a,key,0,8)!=-1)cout<<"找到了,下标为:"<<handle(a,key,0,8);
else cout<<"没找到";
}
运行结果
欢迎指正!