二分查找算法的递归实现

125 阅读3分钟

引言

在编写程序时,我们经常会用到顺序查找,但这种方法并不总是最佳选择。比如当数据量非常大时,顺序查找可能就会有点耗费时间。相比之下,二分搜索在这种情况下就显得尤为重要

二分查找作为一种高效的查找算法。它的基本思想是将有序的元素集合划分为两个子集,然后根据目标值与中间元素的比较结果来确定下一步查找的范围。这个过程可以递归地进行(也可以迭代的进行),直到找到目标值,或者搜索范围为空(即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是数组长度。这是因为每次查找都会将搜索范围缩小一半。因此,二分查找算法在处理大规模数据时非常高效。

然而,这种算法也有其局限性。首先,它只适用于有序数组。如果数组是无序的,那么需要先进行排序,这会增加额外的时间复杂度。其次,如果数组中存在重复元素,那么这种方法可能无法正确找到目标值。