C语言算法练习之折半查找的实现

C语言算法练习之折半查找的实现

什么是折半查找

折半查找(也称二分查找)是一种在有序数组中查找指定元素的查找算法,时间复杂度为O(logn)。

实现步骤

在实现折半查找前,需要明确以下几个步骤:

  1. 确定查找区间范围;
  2. 计算查找区间的中间位置;
  3. 比较中间位置和目标值;
  4. 不断缩小查找范围,直到找到目标值或者查找区间为空。

下面我们来一步步实现。

定义函数

首先需要定义一个 binary_search 函数,该函数接受三个参数:有序数组、数组元素个数和目标值,并返回目标值在数组中的索引。

int binary_search(int arr[], int len, int target) {
    // ...
}

确定查找区间范围

由于折半查找是在有序数组中查找,因此我们需要确定查找区间范围。初始时,查找范围为整个数组,即左右指针初始分别指向数组的第一个和最后一个元素。具体实现如下:

int left = 0;
int right = len - 1;

计算查找区间的中间位置

当确定了查找区间之后,我们需要计算中间位置,即 (left + right) / 2。注意,在计算中间位置时,可能会出现整数溢出的问题,因此最好使用下面的方式计算中间位置,避免整数溢出:

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

比较中间位置和目标值

我们用 mid 指向的元素的值与目标值进行比较。如果相等,则返回 mid,否则根据比较结果,更新查找区间。

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

如果中间元素小于目标值,说明目标值可能在右半边,因此更新左指针为 mid + 1;如果中间元素大于目标值,说明目标值可能在左半边,因此更新右指针为 mid - 1

缩小查找范围

根据比较结果,我们更新查找区间,并重复上述步骤。具体实现如下:

while (left <= right) {
    int mid = left + (right - left) / 2;
    if (arr[mid] == target) {
        return mid;
    } else if (arr[mid] < target) {
        left = mid + 1;
    } else {
        right = mid - 1;
    }
}

完整代码

综上所述, binary_search 函数的完整代码如下:

int binary_search(int arr[], int len, int target) {
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

示例

下面是两个例子,演示了如何使用 binary_search 函数进行折半查找。

#include <stdio.h>

int binary_search(int arr[], int len, int target);

int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int len = sizeof(arr) / sizeof(int);
    int target = 7;
    int index = binary_search(arr, len, target);
    if (index == -1) {
        printf("%d not exist in arr\n", target);
    } else {
        printf("%d at %d position of arr\n", target, index);
    }
    return 0;
}

输出:

7 at 3 position of arr
#include <stdio.h>

int binary_search(int arr[], int len, int target);

int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int len = sizeof(arr) / sizeof(int);
    int target = 6;
    int index = binary_search(arr, len, target);
    if (index == -1) {
        printf("%d not exist in arr\n", target);
    } else {
        printf("%d at %d position of arr\n", target, index);
    }
    return 0;
}

输出:

6 not exist in arr

总结

折半查找是一种高效的查找算法,它的时间复杂度为O(logn),可以快速查找有序数组或者链表中的元素。掌握折半查找的实现方法,对于提高编程能力和解决实际问题都是非常有帮助的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言算法练习之折半查找的实现 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言 strrchr()函数

    C语言strrchr()函数使用攻略 1. 介绍 C语言中的strrchr()函数用于查找字符串中最后一次出现某个字符的位置,即在一个字符串中从后向前查找第一次出现指定字符的位置。strrchr()函数在头文件string.h中声明,函数原型为: char *strrchr(const char *s, int c); 2. 参数 strrchr()函数的参…

    C 2023年5月9日
    00
  • Java异常链表throw结构assert详细解读

    请看下面的详细讲解: Java异常链 Java中的异常链是指,当一个异常被抛出时,可能会引发另一个异常。这个被引发的异常可以包含原始异常的信息。这种机制称为异常链。 在Java中,异常链可以通过调用getCause()方法来获得。该方法返回一个Throwable对象,该对象是造成当前异常的原因。如果没有原因,则返回null。 public class Exc…

    C 2023年5月23日
    00
  • C语言版五子棋游戏的实现代码

    下面给出 C 语言版五子棋游戏的实现代码的完整攻略,包括代码实现过程、技术要点和示例说明。 1. 思路梳理 实现五子棋游戏的代码实现思路如下: 创建游戏窗口,并设置窗口大小; 绘制游戏地图(棋盘); 实现鼠标交互功能,即用户点击某个格子时向这个格子上放置相应的棋子; 判断游戏是否结束,即判断某个玩家是否连成了 5 颗棋子; 实现悔棋功能; 实现人机对战功能。…

    C 2023年5月24日
    00
  • Maplesoft Maple 2019安装许可激活+Update升级教程图文详解(附下载)

    下面我将详细讲解“Maplesoft Maple 2019安装许可激活+Update升级教程图文详解(附下载)”的完整攻略。 Maplesoft Maple 2019安装许可激活+Update升级教程图文详解(附下载) Maplesoft Maple 2019是一款非常优秀的数学软件,在数学建模、图像绘制、符号计算等方面具有非常出色的表现。本文将为大家详细介…

    C 2023年5月22日
    00
  • C语言如何实现可变参数详解

    下面我将详细讲解如何在C语言中实现可变参数。 可变参数的实现方式 在C语言中,可变参数的实现方式是使用stdarg.h头文件中的宏和函数。该头文件包含的是可变参数列表,一些宏和函数的定义,可以实现对参数的操作。 该头文件中常用的宏有: va_start:用于初始化可变参数列表,获取第一个可变参数值的地址。 va_arg:用于获取可变参数列表的下一个参数值。 …

    C 2023年5月23日
    00
  • C语言流程控制之switch语句详解

    C语言流程控制之switch语句详解是本网站总结的一篇C语言教程文章,主要介绍了switch语句的用法和注意事项。本文将通过以下几个方面详细讲解: 1. switch语句的基本格式 switch语句由一个表达式和多个case组成,如下所示: switch(expression){ case constant-expression1: statement1; …

    C 2023年5月23日
    00
  • C语言实现流星雨效果流程

    关于C语言实现流星雨效果,以下是一些步骤: 1. 创建窗口 要在屏幕中创建窗口,需要使用C库中的图形库或者其他GUI库,例如winbgim、OpenGL等。我们以winbgim库为例创建一个控制台窗口。 #include <graphics.h> int main() { initwindow(800, 600, "Meteors&qu…

    C 2023年5月23日
    00
  • 华为Mate 8怎么样 华为Mate8全面评测图解

    华为Mate 8怎么样 华为Mate8全面评测图解 华为Mate 8是华为公司于2015年11月发布的一款大屏旗舰手机。其拥有6英寸的大屏幕、高通骁龙810处理器、4GB RAM、16/32/64GB ROM等高端配置,备受市场关注。下面我们来对这款手机进行全面评测,看看它在各方面的表现如何。 设计和外观 华为Mate8采用了一块6英寸的IPS LCD屏幕,…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部