## 一、查找key元素所在的下标

//1、查找key所在位置的下标
int BinarySearch(int arr[], int len,int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left +(right-left)/2;
if (arr[mid] == key)
{
return mid;
}
else if (arr[mid]<key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}


## 二、查找key的值第一次出现的下标

### 1、方法一：

int BinarySearch_First1(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
int res = -1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
res = mid;
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return res;
}

### 2、方法二：

int BinarySearch_First2(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
if (mid >= 1 && arr[mid - 1] == key)
{
right = mid - 1;
}
else
{
return mid;
}
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}

## 三、查找key的值最后一次出现的下标

### 1、方法一：

int BinarySearch_Last1(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
int res = -1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
res = mid;
left = mid + 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return res;
}

### 2、方法二：

int BinarySearch_Last2(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
if (mid <= right - 1 && arr[mid + 1] == key)
{
left = mid + 1;
}
else
{
return mid;
}
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}


## 四、查找刚好小于key值的最大元素的下标

int BinarySearch_Small(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
if (mid <= right - 1 && arr[mid + 1] < key)
{
left = mid + 1;
}
else
{
return mid;
}
}
else
{
right = mid - 1;
}
}
return -1;
}


## 五、查找刚好小于key值的最小元素的下标

int BinarySearch_Big(int arr[], int len, int key)//[left,right]
{
if (arr == NULL || len <= 0)
return -1;
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
left = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else if (arr[mid]>key)
{
if (mid >= 1 && arr[mid - 1] > key)
{
right = mid - 1;
}
else
{
return mid;
}
}
}
return -1;
}


## 六、总结

1、二分查找一定要关注区间是[ ]还是[ )

2、对应找到key值的最小下标还是最大下标分别有两种方法

3、对于找到刚好比key值小还是比key值大的就是在区间上增加一些判断条件即可，也就是上面的第二类题的第第二种解法

#### 折半查找（二分查找）折半查找（二分查找）折半查找（二分查找）

2009年12月30日 35KB 下载

#### VB 二分查找

2010年06月07日 39KB 下载

#### 经典ACM二分查找，非常好，不下肯定会后悔

2011年05月13日 328KB 下载

#### 二分查找的各种情况实现以及一些注意点

2015-04-28 20:38:36

#### 二分查找算法及其变种

2015-12-06 16:43:23

#### [经典面试题]二分查找问题汇总

2015-01-05 12:16:09

#### 基于二分查找的Junit测试实验

2017-05-24 17:54:14

#### 二分查找(一) 常见错误

2016-12-12 15:50:41

#### 二分查找 python实现

2016-03-28 22:02:51

#### 二分查找的两种实现方式

2017-03-26 21:39:20