二分搜索
二分搜索的前提是列表为有序表
二分法的本质就是不断地缩小空间
假设有一个数组a=[ 1 2 4 5 7 9]
要寻找4的位置
a[mid]<num | l=mid+1 |
---|---|
a[mid]>num | r=mid-1 |
a[mid]==num | return mid |
l | r | 数组 | mid |
---|---|---|---|
0 | 6 | 1 2 4 5 7 9 | 3 |
0 | 2 | 1 2 4 | 1 |
2 | 2 | 1 2 4 | 2 |
return 2
int Two(int *a,int r,int x)
{
int l=0;
int mid;
while (l<=r) {
mid=(l+r)/2;
if(a[mid]==x) return mid;
else if(a[mid]<x) l=mid+1;
else r=mid-1;
}
return l;
//如果搜索的数不存在,则返回第一个大于他的数字的下标
}
这种二分则是寻找递增数列的第一个大于x的数的下标
int Twos(int *a,int r,int x)
{
int l=0;
int mid;
while (l<=r) {
mid=(r+l)/2;
if(a[mid]<=x) l=mid+1;
else r=mid-1;
}
return l;
}