简单记录一下二分查找法的C语言代码
非递归实现
/**
* @brief
* 二分查找非递归实现
* @param arr 数组指针
* @param x 要查找的元素
* @param n 数组长度
* @return int 元素下标
*/
int binary_search(int *arr, int x, int n){
int head = 0, tail = n - 1, mid;
while(head <= tail){
mid = (head + tail) >> 1;
if(arr[mid] == x) return mid;
if(arr[mid] > x) tail = mid - 1;
else head = mid + 1;
}
return -1; // 如果元素不存在则返回-1
}
递归实现
/**
* @brief
* 二分查找递归实现
* @param arr 数组指针
* @param l 头指针下标
* @param r 尾指针下标
* @param x 要找的元素
* @return int 元素下标
*/
int binary_search1(int *arr, int l, int r, int x){
if(l > r) return -1; //元素不存在则返回-1
int mid = (l + r) >> 1;
if(arr[mid] = x) return mid;
if(arr[mid] > x) r = mid - 1;
else l = mid + 1;
return binary_search1(arr, l, r, x);
}
根据我目前的理解,二分查找适用于对有序数组的查找,也可以用于求解某些方程。下面用二分查找实现一个伪sqrt函数。
#include<math.h>
/**
* @brief
* 计算x的平方
* @param x 数x
* @return double
*/
double func(double x){
return x * x;
}
double my_sqrt(double (*func)(double), double x){
if(x < 0) return -1; //如果是负数则退出
double head = 0, tail = x, mid, square;
if(tail < 1.0) tail = 1.0;
#define ACCURACY 1e-7 //定义精度
while(head <= tail){
mid = (tail - head) / 2.0;
square = func(mid);
if(fabs(square) <= ACCURACY) break; //满足精度则退出循环
if(square < x) head = mid;
else tail = mid;
}
#undef ACCURACY
return mid;
}
除了这种做法以外,还可以用head的值与tail的值逼近,只需要修改一下循环体即可。
double my_sqrt(double (*func)(double), double x){
if(x < 0) return -1; //如果是负数则退出
double head = 0, tail = x, mid;
if(tail < 1.0) tail = 1.0;
#define ACCURACY 1e-7 //定义精度
while(fabs(tail - head) > ACCURACY){
mid = (tail - head) / 2.0;
if(func(x) < x) head = mid;
else tail = mid;
}
#undef ACCURACY
return mid;
}