你真的会写二分查找吗?
2017-04-25 12:28
330 查看
二分查找
二分查找变形
随着二分查找的进行,如果找到key并不结束循环的话,最终的结束状态会是right < left,并且right + 1 = left。
当数组中存在key时,根据二分区间选择的不同,这里又分为两种情况,如下图(key为2时),
当数组中不存在key时,最后仅有一种情况,即把图中的黄色框框去掉。
View Code
//二分查找 int binarySearch(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key < arr[mid]) {//key在左边 right = mid - 1; } else if (arr[mid] < key) {//key在右边 left = mid + 1; } else { return mid; } } return -1; }
二分查找变形
随着二分查找的进行,如果找到key并不结束循环的话,最终的结束状态会是right < left,并且right + 1 = left。
当数组中存在key时,根据二分区间选择的不同,这里又分为两种情况,如下图(key为2时),
当数组中不存在key时,最后仅有一种情况,即把图中的黄色框框去掉。
#include <bits/stdc++.h> using namespace std; //二分查找 int binarySearch(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key < arr[mid]) {//key在左边 right = mid - 1; } else if (arr[mid] < key) {//key在右边 left = mid + 1; } else { return mid; } } return -1; } //1 查找最后一个小于key的元素 int findLastLess(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key <= arr[mid]) { right = mid - 1; } else { left = mid + 1; } } return right; } //2 查找第一个大于等于key的元素 int findFirstGreaterEqual(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key <= arr[mid]) { right = mid - 1; } else { left = mid + 1; } } return left; } //3 查找最后一个小于等于key的元素 int findLastLessEqual(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } return right; } //4 查找第一个大于key的元素 int findFirstGreater(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } return left; } //5 查找第一个与key相等的元素 int findFirstEqual(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key <= arr[mid]) { right = mid - 1; } else {//arr[mid] < key left = mid + 1; } } //arr[right] < key <= arr[left] //right是最后一个小于key的 //left是第一个大于等于key的 if (left < len && arr[left] == key) { return left; } return -1; } //6 查找最后一个与key相等的元素 int findLastEqual(int arr[], int len, int key) { int left = 0; int right = len - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (key < arr[mid]) { right = mid - 1; } else {//arr[mid] <= key left = mid + 1; } } //arr[right] <= key < arr[left] //right是最后一个小于等于key的 //left是第一个大于key的 if (right >= 0 && arr[right] == key) { return right; } return -1; } void test() { // int a[] = {0, 1, 2, 3, 4, 5, 6}; int a[] = {0, 1, 2, 2, 2, 5, 6}; int len = 7; int key = 2; int index; int i; for (i = 0; i < len; ++i) { printf("%d ", i); } printf("\n"); for (i = 0; i < len; ++i) { printf("%d ", a[i]); } printf("\n"); // index = binarySearch(a, 10, 2); printf("%d binarySearch\n", binarySearch(a, len, key)); printf("%d findLastLess\n", findLastLess(a, len, key)); printf("%d findFirstGreaterEqual\n", findFirstGreaterEqual(a, len, key)); printf("%d findLastLessEqual\n", findLastLessEqual(a, len, key)); printf("%d findFirstGreater\n", findFirstGreater(a, len, key)); printf("%d findFirstEqual\n", findFirstEqual(a, len, key)); printf("%d findLastEqual\n", findLastEqual(a, len, key)); } int main() { test(); return 0; }
View Code
相关文章推荐
- 二分查找小结
- 二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)
- 大开销递归版二分查找
- 我爱蜜袋鼯 (二分查找再进行贪心判断)
- 【每日算法】开篇&二分查找
- [bzoj3343]&&[洛谷2810] [分块][块内排序][二分查找]教主的魔法
- 二分查找
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 集训第四周(高效算法设计)C题 (二分查找优化题)
- 二分查找key值是否在排序数组中
- C++ Binary Search Sort 二分查找排序算法
- poj 2318 TOYS 叉乘 二分查找
- 三种方法实现二分查找
- 二分查找
- 【POJ】2002 - Squares(暴力枚举 & 双关键字二分查找)
- poj 3258 River Hopscotch 二分查找
- 二分查找
- hdoj 4715 Difference Between Primes 素数筛选+二分查找
- 二分查找
- LintCode python 小白-简单题-457经典二分查找问题