折半查找(二分查找)及使用
在单调的区间里查找一个数值X,如果存在返回下标。复杂度logN
原始算法实现
int binary_search(char *arr, int n, int x) {
int head = 0, tail = n - 1, mid;
while (head <= tail) {
mid = (head + tail) >> 1;
if (arr[mid] == x) return mid;
if (arr[mid] < x) head = mid + 1;
else tail = mid - 1;
}
return -1;
}
1,二分法求解整数平方根
#include <stdio.h>
int func(int x) {
return x * x;
}
int binary_search(int (*arr)(int), int n, int x) {
int head = 0, tail = n - 1, mid;
while (head <= tail) {
mid = (head + tail) >> 1;
if (arr(mid) == x) return mid;
if (arr(mid) < x) head = mid + 1;
else tail = mid - 1;
}
return -1;
}
int main() {
int n;
while (~scanf("%d", &n)) {
int x = binary_search(func, n, n);
printf("%d * %d = %d\n", x, x, n);
}
return 0;
}
2,二分法求解浮点数平方根
#include <stdio.h>
#include <math.h>
double func(double x) {
return x * x;
}
double binary_search(double (*arr)(double), double x) {
double head = 0, tail = x, mid;
if (x < 1.0) tail = 1.0;
#define EPSL 1e-7
while (tail - head > ESPL) {
mid = (head + tail) / 2.0;
if (arr(mid) < x) head = mid;
else tail = mid;
}
#undef EPSL
return head;
}
int main() {
double n;
while (~scanf("%lf", &n)) {
printf("my_sqrt(%g) = %g\n", n, binary_search(func, n));
printf("sqrt(%g) = %g\n", n, sqrt(n));
}
return 0;
}