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语言数组指针表示法

    C语言数组指针表示法是指使用指针访问数组元素的方法。在使用中,我们可以将数组名作为指针使用,指向数组的第一个元素,通过加减指针的偏移量来访问数组中的其他元素。 基本使用方法 定义数组,声明指针 c int a[5] = {1, 2, 3, 4, 5}; int *p; 将数组名作为指针使用,指向数组的第一个元素 c p = &a[0]; // 或者 …

    C 2023年5月9日
    00
  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情 为什么需要JSON序列化 在程序开发过程中,我们通常需要将内存中的数据序列化并存储到文件或者网络中进行传输。JSON作为一种轻量级的数据交换格式,因其具有易读性、易存储、易解析等优点,被广泛应用于前后端数据交互、移动设备数据传输等领域。C++社区相关的JSON库也有很多,但有些过于庞大,并不适用于轻量级数据的处理。因…

    C 2023年5月22日
    00
  • CCtalk中怎么领取C币 CCtalk领取C币教程

    CCtalk 中如何领取C币 概述 CCtalk是一个面向教育培训行业的在线教育平台,用户可以通过在平台上学习、交流等方式获取C币,用于购买学习资料、兑换虚拟商品等等。 领取C币的方式 CCtalk的C币可以通过以下方式获得: 系统赠送:在CCtalk平台注册、使用APP、参加活动等等情况下,会获得系统赠送的C币。 答题赢C币:在CCtalk中参加线上考试、…

    C 2023年5月23日
    00
  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    C++类与对象深入之引用与内联函数与auto关键字及for循环详解 引用 引用是C++中一种比指针更加方便的变量别名。引用可以看作一个已定义变量的别名,这个别名可以和变量一样访问其指向的对象。对引用进行读写操作,其实就是对原对象的读写操作。 使用引用的好处在于,它能够简化一些函数调用及赋值操作。在某些情况下,使用引用也能提高代码运行的效率。 引用的定义格式如…

    C 2023年5月22日
    00
  • C++中图片重命名实现代码

    C++中实现图片重命名可以采用文件操作相关的库函数,如opendir、readdir、rename等。 下面是一份示例代码: #include <iostream> #include <dirent.h> #include <cstring> #include <cstdio> using namespace …

    C 2023年5月30日
    00
  • JSON在Java中的相互转换示例详解

    下面我将为您详细讲解“JSON在Java中的相互转换示例详解”。 一、JSON概述 JSON是什么?JSON(JavaScript Object Notation)是一种用于数据交换的轻量级文本格式。JSON的特点是语法简洁、易于理解、通用性强、可读性高、易于编写和解析等。它是一个用于存储和交换数据的文本格式,常用于Web应用程序中。 JSON的格式结构JS…

    C 2023年5月23日
    00
  • JS中循环遍历数组的四种方式总结

    JS中循环遍历数组的四种方式总结 在JavaScript编程中,遍历数组是一个非常常见的操作。在本文中,我将介绍四种JS中循环遍历数组的方式,它们分别是: for循环 forEach()方法 map()方法 for…in循环 1. for循环 for循环是最基本也是最常用的JS中遍历数组的方法。它的语法如下: for(let i = 0; i < …

    C 2023年5月22日
    00
  • 基于opencv的selenium滑动验证码的实现

    首先需要明确的是,基于opencv的selenium滑动验证码实现主要考察的是图像识别和模拟鼠标操作的能力。下面是详细的攻略: 步骤一:收集参考图片和滑块图片 首先需要在浏览器中打开目标网站,然后找到需要滑动验证码的页面。在这个页面中,需要使用开发者工具的元素选择器找到验证码区域的HTML元素,然后通过selenium的接口获取到该元素的截图,作为参考图片。…

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