C语言数据结构中二分查找递归非递归实现并分析

C语言数据结构中二分查找递归及非递归实现

二分查找基本原理

二分查找(Binary Search)是一种基于比较目标值和中间元素的教科书式算法。每次查找都将查找范围缩小一半,直到找到目标值为止,或发现查找范围已经为空。

二分查找前提条件

在使用二分查找之前,我们需要满足以下两个前提条件:

  • 数组必须是有序的。
  • 数组需要支持随机访问,也就是支持索引。

二分查找的两种方法

在C语言中,我们通常使用两种方式实现二分查找:递归和非递归。

递归方法实现二分查找

递归实现二分查找通常需要定义一个辅助函数,如下所示:

#include <stdio.h>

int binaryRecursiveSearch(int *arr, int low, int high, int target) {
    if (low > high) {
        return -1;
    }
    int middle = (low + high) / 2;
    if (arr[middle] == target) {
        return middle;
    }
    if (arr[middle] > target) {
        return binaryRecursiveSearch(arr, low, middle - 1, target);
    } else {
        return binaryRecursiveSearch(arr, middle + 1, high, target);
    }
}

int main() {
    int arr[] = {1, 3, 5, 7, 9, 11, 13};
    int length = sizeof(arr) / sizeof(int);
    int target = 11;
    int index = binaryRecursiveSearch(arr, 0, length - 1, target);
    printf("Target %d is located at %d.\n", target, index);
    return 0;
}

在上述代码中,binaryRecursiveSearch 函数是一个递归函数,接收四个参数:

  • arr表示要查找的数组;
  • low表示数组范围的最小索引;
  • high表示数组范围的最大索引;
  • target表示要查找的目标元素。

首先,函数会计算出数组范围的中间索引,并将其保存在 middle 变量中。接着,如果 arr[middle] == target,则说明目标元素就是这个中间元素,直接返回 middle。如果 arr[middle] > target,则说明目标元素在数组范围的左半部分,于是递归调用 binaryRecursiveSearch(arr, low, middle - 1, target);否则,目标元素就在数组范围的右半部分,递归调用 binaryRecursiveSearch(arr, middle + 1, high, target)。如果递归到数组范围为空,即 low > high,则返回 -1 表示未找到目标元素。

我们可以将上述函数调用一个示例,如下所示:

int arr[] = {1, 3, 5, 7, 9, 11, 13};
int length = sizeof(arr) / sizeof(int);
int target = 11;
int index = binaryRecursiveSearch(arr, 0, length - 1, target);
printf("Target %d is located at %d.\n", target, index);

在上述代码中,我们先定义一个有序的数组 arr,然后计算出数组的长度 length 和要查找的目标元素 target。最后,我们调用递归函数 binaryRecursiveSearch(arr, 0, length - 1, target),找到目标元素在数组中的索引。

非递归方法实现二分查找

非递归方式实现二分查找相较于递归方式略显繁琐,但却可以避免函数调用栈大小不断增长的问题,同时也可以节省时间。

非递归方式实现二分查找示例代码如下:

#include <stdio.h>

int binaryIterativeSearch(int *arr, int size, int target) {
    int left = 0;
    int right = size - 1;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (arr[middle] == target) {
            return middle;
        } else if (arr[middle] > target) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    return -1;
}

int main() {
    int arr[] = {1, 3, 5, 7, 9, 11, 13};
    int length = sizeof(arr) / sizeof(int);
    int target = 11;
    int index = binaryIterativeSearch(arr, length, target);
    printf("Target %d is located at %d.\n", target, index);
    return 0;
}

在上述代码中,我们定义了一个名为 binaryIterativeSearch 的函数。与递归方式不同,迭代式查找需要三个参数:

  • arr 表示要查找的数组;
  • size 表示数组的长度;
  • target 表示要查找的目标元素。

函数中,我们首先定义了两个变量 leftright,分别用于表示数组的最小索引和最大索引。通过不断缩小范围,最终找到目标元素或返回 -1 表示未找到。具体实现如下:

  • 每次找到中间元素 middle = (left + right) / 2
  • 如果 arr[middle] == target,直接返回 middle
  • 如果 arr[middle] > target,说明要查找的元素在数组的左半部分,于是右边界 right 变成了 middle - 1
  • 如果 arr[middle] < target,说明要查找的元素在数组的右半部分,于是左边界 left 变成了 middle + 1
  • 不断缩小范围,直到找到或未找到。

我们可以通过一个示例代码来演示非递归方式实现二分查找:

int arr[] = {1, 3, 5, 7, 9, 11, 13};
int length = sizeof(arr) / sizeof(int);
int target = 11;
int index = binaryIterativeSearch(arr, length, target);
printf("Target %d is located at %d.\n", target, index);

在上述代码中,我们先定义一个有序的数组 arr,然后计算出数组的长度 length 和要查找的目标元素 target。最后,我们调用非递归函数 binaryIterativeSearch(arr, length, target),找到目标元素在数组中的索引。

总结

本文演示了C语言数据结构中二分查找的递归和非递归两种实现方式,并且讲解了二分查找的基本原理和前提条件,希望对读者掌握二分查找有所帮助。

示例说明

  1. 递归实现二分查找

在示例中,定义一个有序的数组 arr,然后计算出数组的长度 length 和要查找的目标元素 target。最后,调用递归函数 binaryRecursiveSearch(arr, 0, length - 1, target),找到目标元素在数组中的索引。

  1. 非递归实现二分查找

在示例中,定义一个有序的数组 arr,然后计算出数组的长度 length 和要查找的目标元素 target。最后,调用非递归函数 binaryIterativeSearch(arr, length, target),找到目标元素在数组中的索引。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构中二分查找递归非递归实现并分析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Python3与fastdfs分布式文件系统如何实现交互

    Python3可以通过使用fdfs-client-py库来与FastDFS分布式文件系统进行交互。下面是该过程的完整攻略: 安装fdfs-client-py库 使用pip可以方便的安装fdfs-client-py库,命令如下: pip install fdfs-client-py 配置FastDFS客户端 在Python代码中,我们将使用FastDFS提供的…

    other 2023年6月27日
    00
  • 五子棋ai(aipha-beta算法)

    当然,我很乐意为您提供有关五子棋AI(Alpha-Beta算法)的完整攻略。以下是详细的步骤和两个示例: 1. 什么是Alpha-Beta算法? Alpha-Beta算法是一种用于博弈树搜索的剪枝算法。它可以有效地减少搜索的节点数,从而提高搜索效率。在五子棋AI中,Alpha-Beta算法可以用于搜索最佳落子位置。 2. Alpha-Beta算法的基本原理 …

    other 2023年5月6日
    00
  • 朱莉娅dataframe的转置

    下面是关于“朱莉娅DataFrame的转置”的完整攻略: 1. 朱莉娅DataFrame 简介 朱莉娅(Julia)是一种性能的动态编程语言,它具有快速的执行速和于使用的语法。DataFrame 是朱莉娅中的一种数据结构,类似于 Python 中的 Pandas DataFrame,用于处理和分析数据。 2. 朱莉娅DataFrame 的转置 DataFra…

    other 2023年5月7日
    00
  • 手机usb调试在哪里

    USB调试是一种在开发和测试Android应用程序时非常有用的功能。它通过USB连接将Android设备连接到计算机上,并允许开发人员查看设备日志、运行命令行工具以及测试应用程序。 以下是在不同操作系统上使用USB调试的完整攻略: 在Windows上使用USB调试 安装Android SDK 在Windows上使用USB调试需要安装Android SDK。下…

    其他 2023年4月16日
    00
  • 用vnc实现Windows远程连接linux桌面之服务器配置

    这里提供一个使用 VNC 实现在 Windows 上远程连接 Linux 桌面的攻略,主要分为以下几个步骤: 安装 VNC 服务器 首先在 Linux 服务器上安装 VNC 服务器,这里以 Ubuntu 18.04 服务器为例: sudo apt-get update sudo apt-get install tightvncserver 启动 VNC 服务…

    other 2023年6月27日
    00
  • json解析—gson以及gsonformat插件的运用

    json解析—gson以及gsonformat插件的运用 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的子集,可以被各种编程语言读取和写入。相对于XML格式,JSON更为简洁,易于阅读和编写。 GSON简介 GSON是Google提供的用于Java和Android的…

    其他 2023年3月29日
    00
  • Linux服务器基本应用

    Linux服务器基本应用攻略 1、常用操作系统及安装 常用的Linux操作系统有Ubuntu、CentOS、Debian、Red Hat等,其中CentOS是最常用的服务器操作系统之一。 安装CentOS的过程如下:1. 下载CentOS官方镜像,刻录至U盘等载体。2. 进入服务器BIOS设置,选择从U盘启动。3. 进入CentOS安装页面,按提示进行操作,…

    other 2023年6月27日
    00
  • iOS9正式版固件下载地址大全 iOS9正式版升级教程

    iOS9正式版固件下载地址大全 iOS9是苹果公司推出的操作系统的最新版本。本攻略将为您提供iOS9正式版固件下载地址大全以及升级教程。 步骤一:备份数据 在升级之前,建议您先备份您的设备上的所有数据。这样可以确保您的数据在升级过程中不会丢失。您可以通过iTunes或iCloud进行备份。 步骤二:选择合适的固件下载地址 在升级之前,您需要下载适用于您的设备…

    other 2023年8月4日
    00
合作推广
合作推广
分享本页
返回顶部