引言
在编写程序时,我们经常会用到顺序查找,但这种方法并不总是最佳选择。比如当数据量非常大时,顺序查找可能就会有点耗费时间。相比之下,二分搜索在这种情况下就显得尤为重要。
二分查找作为一种高效的查找算法。它的基本思想是将有序的元素集合划分为两个子集,然后根据目标值与中间元素的比较结果来确定下一步查找的范围。这个过程可以递归地进行(也可以迭代的进行),直到找到目标值,或者搜索范围为空(即low > high)。
下面,我将详细介绍用C语言实现的递归二分查找算法。
主函数设计
在主函数main中,我们首先定义了一个整形数组arr[],并计算了其数组长度n。然后,我们提示用户输入一个索引值,并将其存储在变量target中。接着,我们调用binary_search_recursive函数(该函数是自己设计的,后文会介绍)进行查找,并将结果存储在变量result中。最后,我们根据result的值输出查找结果。
int main() {
int i, j;
int arr[] = { 1,3,5,7,9,11,15 };
int n = sizeof(arr) / sizeof(int);
int target;
printf("已知数组{ 1,3,5,7,9,11,15 }\n");
printf("请输入索引值:\n");
scanf_s("%d", &target);
int result = binary_search_recursive(arr, target, 0, n - 1);
if (result == -1)
printf("目标值 %d 没有找到", target);
else
printf("目标值 %d 的索引为 %d", target, result);
return 0;
}
函数定义
在这里,我们定义了一个名为binary_search_recursive的函数,该函数传递四个参数:一个整形数组arr[],一个索引值target,以及两个表示搜索范围的整数low和high。根据索引值target和中间值mid的比较,变换low或者high的位置(或者因为相等,所以直接结束查找)。多次调用binary_search_recursive函数,就可以实现查找了。代码和图解见下方:
int binary_search_recursive(int arr[], int target, int low, int high)
{
if (low > high)
return -1; // 如果 low 大于 high,则说明没有找到目标值
int mid = (low + high) / 2;
if (arr[mid] == target)
return mid; // 如果中间值等于目标值,则返回中间值的索引
else if (arr[mid] > target)
return binary_search_recursive(arr, target, low, mid - 1); // 如果中间值大于目标值,则在左侧继续查找
else
return binary_search_recursive(arr, target, mid + 1, high); // 如果中间值小于目标值,则在右侧继续查找
}
总结
二分查找算法的时间复杂度为O(log n),其中n是数组长度。这是因为每次查找都会将搜索范围缩小一半。因此,二分查找算法在处理大规模数据时非常高效。
然而,这种算法也有其局限性。首先,它只适用于有序数组。如果数组是无序的,那么需要先进行排序,这会增加额外的时间复杂度。其次,如果数组中存在重复元素,那么这种方法可能无法正确找到目标值。