二分查找

 

 1 //二分查找
 2 int binarySearch(int arr[], int len, int key)
 3 {
 4     int left = 0;
 5     int right = len - 1;
 6     int mid;
 7 
 8     while (left <= right) {
 9         mid = (left + right) / 2;
10         if (key < arr[mid]) {//key在左边
11             right = mid - 1;
12         } else if (arr[mid] < key) {//key在右边
13             left = mid + 1;
14         } else {
15             return mid;
16         }
17     }
18     return -1;
19 }

 

 

二分查找变形

随着二分查找的进行,如果找到key并不结束循环的话,最终的结束状态会是right < left,并且right + 1 = left。

当数组中存在key时,根据二分区间选择的不同,这里又分为两种情况,如下图(key为2时),

当数组中不存在key时,最后仅有一种情况,即把图中的黄色框框去掉。

你真的会写二分查找吗?

那么,可以找到

1 最后一个小于key的元素,1,

2 第一个大于等于key的元素,2,

3 最后一个小于等于key的元素,2,

4 第一个大于key的元素,5,

另外,如果存在多个key时,稍加判断,就可以找到

5 第一个与key相等的元素

6 最后一个与key相等的元素

 

1 查找最后一个小于key的元素

 1 //1 查找最后一个小于key的元素
 2 int findLastLess(int arr[], int len, int key)
 3 {
 4     int left = 0;
 5     int right = len - 1;
 6     int mid;
 7 
 8     while (left <= right) {
 9         mid = (left + right) / 2;
10         if (key <= arr[mid]) {
11             right = mid - 1;
12         } else {
13             left = mid + 1;
14         }
15     }
16     return right;
17 }
View Code

相关文章:

  • 2021-09-21
  • 2021-07-30
  • 2021-10-03
  • 2021-06-10
  • 2021-08-30
  • 2021-09-29
  • 2020-04-10
猜你喜欢
  • 2021-09-29
  • 2021-08-24
  • 2022-03-03
  • 2021-10-02
  • 2021-10-29
  • 2022-01-03
相关资源
相似解决方案