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语言实现24点问题详解

    C语言实现24点问题详解 在解决24点问题时,主要思路是找出四个数字任意排列后,通过加、减、乘、除的算术运算,得出结果为24的表达式。 实现思路 输入四个数字,利用嵌套的for循环全排列,共有4×3×2×1 = 24种排列方式。 然后通过嵌套的for循环枚举其中的3个数字,并针对这3个数字求解所有的算术运算,共有3×2×1 = 6种组合方式(不考虑顺序)。 …

    C 2023年5月23日
    00
  • 解读C语言非void函数却没有return会怎么样

    解读C语言非void函数却没有return会怎么样: 当一个C语言函数声明为非void类型时,我们期望它返回一个值,但如果没有在函数内部使用return关键字,则可能会导致以下问题: 函数返回值不确定 在非void函数没有return语句时,函数返回值不确定,编译器会尝试返回一个随机值或者未初始化的值,这可能会导致程序运行时无法预期的行为。例如,在以下代码中…

    C 2023年5月23日
    00
  • C语言实现职工管理系统

    C语言实现职工管理系统完整攻略 1. 概述 C语言实现职工管理系统的主要目的是建立一个能够简单快速地管理职工信息的系统。该系统可以实现添加、删除、修改、查询职工信息等功能。 2. 设计思路 2.1 数据结构设计 我们可以使用如下的数据结构来存储职工信息: typedef struct Employee { int num; // 职工编号 char name…

    C 2023年5月23日
    00
  • SpringBoot整合Redis入门之缓存数据的方法

    下面是 “SpringBoot整合Redis入门之缓存数据的方法” 的完整攻略。 简介 在高并发访问下,数据库成为了性能瓶颈,为了解决这个问题,我们可以加入缓存来减轻数据库的压力,提高网站的响应速度。Redis作为一个高性能的内存数据库,被广泛应用于缓存系统中。在SpringBoot中,通过RedisTemplate来实现redis的缓存数据。 环境准备 首…

    C 2023年5月23日
    00
  • C语言代码实现简单2048游戏

    C语言代码实现简单2048游戏攻略 简介 在这篇攻略中,我将教您如何使用C语言编写简单的2048游戏。2048是一个流行的数字益智游戏,目标是在一个4×4的方格中合并数字,并达到最大的数字2048。在这个过程中,我们将使用C语言并结合控制流和数组等知识点来完成我们的游戏。 步骤 步骤1:定义游戏棋盘 在2048游戏中,我们需要定义一个4×4的棋盘来存储游戏状…

    C 2023年5月23日
    00
  • C语言指针必备基础全面覆盖

    C语言指针必备基础全面覆盖攻略 为什么需要学习指针 在C语言中,指针是一个非常重要的概念,很多高级的编程技术都需要用到指针。同时,C语言本身也是一个比较底层的语言,直接操作内存地址是比较常见的操作,而指针的本质就是存储内存地址。因此,对于C语言开发者来说,学习指针是非常必要的。 指针的基本概念 指针的本质是一个变量,其存储的是一个内存地址,而不是实际的数据。…

    C 2023年5月23日
    00
  • C语言实现简单推箱子游戏

    C语言实现简单推箱子游戏攻略 游戏概述 推箱子游戏是一款非常经典的智力益智游戏,玩家需要控制箱子的移动,将箱子全部移动到指定位置即可获胜。在本文中,我们将使用C语言来实现一个简单的推箱子游戏。 游戏规则 游戏地图上有若干个箱子和若干个目标点。 箱子只能水平或垂直移动,不能斜着移动。 箱子不能移动到墙上,也不能推到其他的箱子或目标点上。 箱子被推到目标点上后,…

    C 2023年5月22日
    00
  • 用C++面向对象的方式动态加载so的方法

    很好,用C++面向对象的方式动态加载so的方法可以通过以下步骤实现: 1. 准备工作 在开始使用C++动态加载so前,需要安装相关的开发库,具体步骤可以参考系统文档或者官方网站的说明。以Ubuntu为例,安装GCC开发环境和动态库加载库libdl的命令为: $ sudo apt-get install build-essential $ sudo apt-g…

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