📜  二进制搜索的C程序(递归和迭代)(1)

📅  最后修改于: 2023-12-03 15:06:20.569000             🧑  作者: Mango

二进制搜索的C程序(递归和迭代)

介绍

二进制搜索(Binary Search)是一种在有序数组中查找某一特定元素的搜索算法。该算法使用二分法的思想,从数组的中间开始搜索,如果中间元素正好是要查找的元素,则搜索过程结束,否则如果中间元素大于要查找的元素,由于数组已经有序,则要查找的元素一定在数组的左半部分,于是只要在数组的左半部分继续查找;如果中间元素小于要查找的元素,则要查找的元素一定在数组的右半部分,于是只要在数组的右半部分继续查找。不断重复上述过程,直到找到要查找的元素或者确定这样的元素不存在为止。

在此介绍二进制搜索的C程序,并分别给出其递归和迭代的实现。

递归实现

递归是一种函数自己调用自己的方式,对于二进制搜索来说,递归可以自然地利用二分法的思想来实现。

int binary_search_recursive(int arr[], int left, int right, int target) {
    if (left > right) {
        return -1;
    }

    int mid = left + (right - left) / 2;

    if (arr[mid] == target) {
        return mid;
    } else if (arr[mid] > target) {
        return binary_search_recursive(arr, left, mid - 1, target);
    } else {
        return binary_search_recursive(arr, mid + 1, right, target);
    }
}

在递归实现中,需要定义一个函数 binary_search_recursive,该函数接收四个参数:

  • arr:要搜索的有序数组
  • left:搜索范围左边界(包含)
  • right:搜索范围右边界(包含)
  • target:要查找的元素

函数的返回值为要查找的元素在数组中的索引,如果该元素不存在则返回 -1

在函数的内部,首先判断左边界是否大于右边界,如果是,则说明要查找的元素不在数组中,直接返回 -1

接着计算中间元素的索引,如果中间元素正好是要查找的元素,则搜索过程结束,返回中间元素的索引。

否则,如果中间元素大于要查找的元素,由于数组已经有序,则要查找的元素一定在数组的左半部分,于是只要在左半部分继续查找,递归调用 binary_search_recursive 函数,并更新搜索范围的右边界为 mid - 1

如果中间元素小于要查找的元素,则要查找的元素一定在数组的右半部分,于是只要在右半部分继续查找,递归调用 binary_search_recursive 函数,并更新搜索范围的左边界为 mid + 1

不断重复上述过程,直到找到要查找的元素或者确定这样的元素不存在为止。最终返回要查找的元素在数组中的索引,或者 -1

迭代实现

迭代是用循环语句实现的函数调用,对于二进制搜索来说,迭代的实现可以使用 while 循环。

int binary_search_iterative(int arr[], int left, int right, int target) {
    while (left <= right) {
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }

    return -1;
}

在迭代实现中,也需要定义一个函数 binary_search_iterative,该函数接收四个参数:

  • arr:要搜索的有序数组
  • left:搜索范围左边界(包含)
  • right:搜索范围右边界(包含)
  • target:要查找的元素

函数的返回值为要查找的元素在数组中的索引,如果该元素不存在则返回 -1

在函数的内部,使用 while 循环不断重复以下过程:

首先计算中间元素的索引,如果中间元素正好是要查找的元素,则搜索过程结束,返回中间元素的索引。

否则,如果中间元素大于要查找的元素,由于数组已经有序,则要查找的元素一定在数组的左半部分,于是只要在左半部分继续查找,更新搜索范围的右边界为 mid - 1

如果中间元素小于要查找的元素,则要查找的元素一定在数组的右半部分,于是只要在右半部分继续查找,更新搜索范围的左边界为 mid + 1

直到左边界大于右边界,说明要查找的元素不在数组中,直接返回 -1

最终返回要查找的元素在数组中的索引,或者 -1

结论

以上介绍了二进制搜索的C程序,并分别给出了递归和迭代两种方式的实现。其中,递归实现的代码简洁,易于理解;而迭代实现的代码耗时更短,更适合使用在大规模数据上的搜索。

如果需要在有序数组中查找某一特定元素,可以使用以上代码进行二进制搜索。