C语言输入是一个有序的元素列表(必须是有序的),如果查找的元素包含在列表中,二分查找返回其位置,否则返回-1。请分别采用递归算法和非递归算法进行解决。
时间: 2024-09-10 12:06:00 浏览: 37
C语言二分查找算法及实现代码
5星 · 资源好评率100%
二分查找是一种在有序数组中查找特定元素的高效算法。其基本思想是将数组分成两半,比较中间元素与目标值,根据比较结果排除一半的元素,然后在剩余部分继续查找,直到找到目标或范围为空。
以下是使用C语言实现的二分查找算法,包括递归和非递归两种方式。
递归算法实现:
```c
// 递归实现的二分查找
int binary_search_recursive(int arr[], int left, int right, int x) {
if (right >= left) {
int mid = left + (right - left) / 2;
// 如果元素正好在中间
if (arr[mid] == x) {
return mid;
}
// 如果元素小于中间元素,则只能在左半边查找
if (arr[mid] > x) {
return binary_search_recursive(arr, left, mid - 1, x);
}
// 否则元素只能在右半边查找
return binary_search_recursive(arr, mid + 1, right, x);
}
// 未找到元素
return -1;
}
```
非递归算法实现:
```c
// 非递归实现的二分查找
int binary_search_iterative(int arr[], int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2;
// 检查x是否在中间
if (arr[m] == x) {
return m;
}
// 如果x大于中间元素,则只能在左半边查找
if (arr[m] < x) {
l = m + 1;
}
// 否则x只能在右半边查找
else {
r = m - 1;
}
}
// 未找到元素
return -1;
}
```
在这两种实现中,`arr[]` 是输入的有序数组,`l` 和 `r` 是数组的左右边界索引,`x` 是要查找的目标值。递归算法通过函数自我调用来简化代码,而非递归算法使用循环来进行迭代查找。
阅读全文