From 4d8d45e95b3e8a01c82ea30de8bc733e5d34a863 Mon Sep 17 00:00:00 2001 From: pn43tqvrm <2516333959@qq.com> Date: Sat, 19 Feb 2022 16:12:56 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E4=BA=8C=E5=88=86=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 二分排序 | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 二分排序 diff --git a/二分排序 b/二分排序 new file mode 100644 index 0000000..6ef9fde --- /dev/null +++ b/二分排序 @@ -0,0 +1,44 @@ +//二分法 +// 整数二分 +bool check(int x) {/* ... */} // 检查x是否满足某种性质 + +// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: +int bsearch_1(int l, int r) +{ + while (l < r) + { + int mid = l + r >> 1; + if (check(mid)) r = mid; // check()判断mid是否满足性质 + else l = mid + 1; + } + return l; +} +// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用: +int bsearch_2(int l, int r) +{ + while (l < r) + { + int mid = l + r + 1 >> 1; + if (check(mid)) l = mid; + else r = mid - 1; + } + return l; +} + + +// 浮点数二分 +bool check(double x) {/* ... */} // 检查x是否满足某种性质 + +double bsearch_3(double l, double r) +{ + const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求 + while (r - l > eps) + { + double mid = (l + r) / 2; + if (check(mid)) r = mid; + else l = mid; + } + return l; +} + +//复杂度说明: 时间复杂度为o(logn). \ No newline at end of file