二分查找
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 }