这个分类方法我是从知乎是哪个面看到的,这里给大家普及一下:
64种。
对其进行分类:
取整方式:
向下取整 向上取整 (共2种)
**区间开闭:
**
闭区间 左闭右开区间 左开右闭区间 开区间 (共4种)
问题类型:
**对于不下降序列a,求最小的i,使得a[i] = key
对于不下降序列a,求最大的i,使得a[i] = key
对于不下降序列a,求最小的i,使得a[i] > key
对于不下降序列a,求最大的i,使得a[i] < key
对于不上升序列a,求最小的i,使得a[i] = key
对于不上升序列a,求最大的i,使得a[i] = key
对于不上升序列a,求最小的i,使得a[i] < key
对于不上升序列a,求最大的i,使得a[i] > key**
(共8种)综上所述,二分查找共有 2 * 4 * 8 = 64 种写法。
对于不下降序列的,四种分类写出代码如下:
// a2 >= a1, min i a[i] = key;
int binary_search_1(int a[], int n, int key)
{
int mid;
int s = 0;
int e = n - 1;
while(s < e)
{
mid = s + (e - s) >> 1;// 向下取整
if(key <= a[mid])
e = mid;
else
s = mid + 1;
}
if(a[e] == key) return e;
return -1;
}
// a2 >= a1, max i , a[i] = key
int binary_search_2(int a[], int n, int key)
{
int mid;
int s = 0;
int e = n - 1;
while(s < e)
{
mid = s + (e - s + 1) >> 1;// 向上取整
if(key >= a[mid])
s = mid;
else
e = mid - 1;
}
if(a[s] == key) return s;
return -1;
}
//a2 >= a1, min i, a[i] > key
int binary_search_3(int a[], int n, int key)
{
int mid;
int s = 0;
int e = n - 1;
while(s < e)
{
mid = s + (e - s) >> 1;//向下取整
if(key < a[mid])
e = mid;
else
s = mid + 1;
}
if(a[e] > key) return e;
return -1;
}
// a2 >= a1, max i, a[i] < key
int binary_search_4(int a[], int n, int key)
{
int mid;
int s = 0;
int e = n - 1;
while(s < e)
{
mid = s + (r - s + 1) >> 1;//向上取整
if(key > a[mid])
s = mid;
else
e = mid - 1;
}
if(a[s] < key) return s;
return -1;
}