二分查找的几种不同的实现
2017-09-11 21:10
211 查看
不多说,直接上代码,注释解释清楚了
# include <iostream> # include <vector> # include <cstring> # include <string> # include <sstream> # include <istream> using namespace std; //////////////////////////////////////////////////////////////////// template <typename T> vector <T> scanf_r() { cin.sync(); string input_string; while(true) { getline(cin, input_string); if (input_string != "\n") break; } istringstream input_stream(input_string); vector <T> ret; T item; while(input_stream >> item) ret.push_back(item); return ret; } template <typename T> T scanf(string prompt="", istream & input_stream = cin){ T ret; while (cout << prompt, !(input_stream >> ret)) { input_stream.clear(); // reset the state of cin input_stream.sync(); // synchronize the buffer of cin } return ret; } ////////////////////////////////////////////////////////////////////// /** * 最小的i, 满足arr[i] = target. 不存在 返回 -1 */ int bin_1(vector<int> & arr, int target) { int size = arr.size(); int l = 0, r = size - 1, mid; while(l < r) { mid = l + ((r - l) >> 1); // 奇数: 中间; 偶数: 两个中间数的第一个 if(arr[mid] < target) l = mid + 1; else // arr[i] >= target r = mid; } return (arr[l] == target) ? l : -1; } /** * 最大i, 满足arr[i] = target。 不存在, 返回-1 */ int bin_2(vector<int> & arr, int target) { int size = arr.size(); int l = 0, r = size - 1, mid; while(l < r) { mid = l + ((r - l + 1) >> 1); // 奇数: 中间; 偶数 : 两个中间数的第二个 if(arr[mid] > target) r = mid - 1; else // arr[i] <= target l = mid; } return (arr[l] == target) ? l : -1; } /** * 求最小的i,使得a[i] > target,若不存在,则返回-1 */ int bin_3(vector<int> & arr, int target) { int size = arr.size(); int l = 0, r = size - 1, mid; while(l < r) { mid = l + ((r - l) >> 1); if(arr[mid] > target) r = mid; else l = mid + 1; } return (arr[l] > target) ? l : -1; } /** * 求最大的i,满足a[i] < target, 若不存在, 返回 -1 */ int bin_4(vector<int> & arr, int target) { int size = arr.size(); int l =0, r = size - 1, mid; while(l < r) { mid = l + ((r - l + 1) >> 1); if(arr[mid] < target) l = mid; else r = mid - 1; } return (arr[l] < target) ? l : -1; } /** * 求最小的i,满足a[i] >= target, 若不存在, 返回 -1 */ int bin_5(vector<int> & arr, int target) { int size = arr.size(); int l = 0, r = size - 1, mid; while(l < r) { mid = l + ((r - l) >> 1); if(arr[mid] >= target) r = mid; else l = mid + 1; } return (arr[l] >= target) ? l : -1; } /** * 求最大的i,满足a[i] <= target, 若不存在, 返回 -1 */ int bin_6(vector<int> & arr, int target) { int size = arr.size(); int l = 0, r = size - 1, mid; while(l < r) { mid = l + ((r - l + 1) >> 1); if(arr[mid] <= target) l = mid; else r = mid - 1; } return (arr[l] <= target) ? l : -1; } ///////////////////////////////////////////////////////////////////////////// void test( int (*bin) ( vector<int> &, int), string title) { cout << "------test " << title << " with target : 2 ----------" << endl; for(int i = 0; i < 3; i++) { vector<int> vec = scanf_r<int>(); cout << bin(vec, 2) << endl; } cout << "------- end ---------------" << endl; } //////////////////////////////////////////////////////////////////////////// int main() { bool is_on = true; while(is_on) { cout << "choose a bin function to test: "; int key = scanf<int>(); switch(key) { case 1: test(bin_1, string("bin_1(min i for arr[i] = target)")); break; case 2: test(bin_2, string("bin_2(max i for arr[i] = target)")); break; case 3: test(bin_3, string("bin_3(min i for arr[i] > target)")); break; case 4: test(bin_4, string("bin_4(max i for arr[i] < target)")); break; case 5: test(bin_5, string("bin_5(min i for arr[i] >= target)")); break; case 6: test(bin_6, string("bin_6(max i for arr[i] <= target)")); break; case 0: is_on = false; break; default:; } } return 0; }
相关文章推荐
- js实现常见的几种算法(数组去重、字符统计、二分查找等)
- 二分查找的几种方法对比,C++实现
- 几种不同的二分查找
- Python 实现查找的几种类型 (线性查找,线性有序查找,线性查找最小值,二分查找)
- 算法 第四版 1.4.22 仅用加减实现的二分查找
- 一个可能存在Bug的二分查找方法的实现,大家一起看看有什么问题没
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- [算法]java实现 二分查找 斐波那契数列 静静思考
- HDU 2141 二分查找,实现上简单,思想很重要
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 二分查找之Java实现
- 二分查找的各种情况实现以及一些注意点
- 二分查找的递归和非递归实现
- 数据结构:二分查找的递归与非递归实现--C实现
- 二分查找递归实现--【编程珠玑】
- 【C语言】编写函数实现二分查找
- 在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
- 函数模板实现二分查找
- C语言二分查找算法及实现代码