用C语言实现二分查找算法

当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。

以下是在C语言中实现二分查找的完整攻略:

1. 确定查找范围

首先,我们需要确定要在哪个范围内进行查找。通常情况下,查找的范围是一个有序数组。我们可以通过定义一个数组来确定查找范围,例如:

int arr[] = {1, 3, 5, 7, 9, 11, 13};
int n = sizeof(arr) / sizeof(arr[0]);

这里定义了一个包含7个元素的、有序的整型数组,名称为arrn变量表示了数组中元素的个数,也就是数组的大小。

2. 定义二分查找函数

接下来,我们需要定义一个二分查找函数,用于在arr数组中查找指定的元素。函数的定义如下:

int binary_search(int arr[], int n, int target) {
    int left = 0;
    int right = n - 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;
}

该函数接受三个参数:arr表示要查找的数组,n表示数组的大小,target表示要查找的元素。函数返回值为查找到的元素的下标,若未找到则返回-1。

具体的实现过程如下:

  1. 首先定义两个变量leftright,分别表示查找范围的左端点和右端点。由于我们要在整个数组中进行查找,所以初始时left为0,rightn-1
  2. 使用while循环对范围进行缩小,直到查找到目标元素或者无法缩小为止。在循环中,首先通过计算中间元素的下标mid,用于接下来的比较。这里中间元素的下标计算公式使用了left + (right - left) / 2的方式,该方式可以有效防止整型溢出问题。接下来,将中间元素与目标元素进行比较:
    • 如果相等,则返回中间元素的下标;
    • 如果中间元素小于目标元素,则在右半部分继续查找,此时需要将左端点的位置更新为mid+1
    • 如果中间元素大于目标元素,则在左半部分继续查找,此时需要将右端点的位置更新为mid-1
  3. 如果循环结束时仍未查找到目标元素,则说明目标元素不存在于数组中,返回-1。

3. 调用二分查找函数

最后,我们需要调用定义好的二分查找函数来查找指定的元素。例如,要查找数字5在arr数组中的位置,可以使用以下代码:

int index = binary_search(arr, n, 5);
if (index == -1) {
    printf("Element not found\n");
} else {
    printf("Element found at index %d\n", index);
}

该代码将会输出Element found at index 2,表示数字5位于数组arr的下标为2的位置。

我们再来看一个更加复杂的示例,该示例使用二分查找函数在升序排列的数组中查找第一个大于某个值的元素的下标。

#include <stdio.h>

int binary_search(int arr[], int n, int target) {
    int left = 0;
    int right = n - 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;
}

int main() {
    int arr[] = {1, 3, 4, 5, 7, 9, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 6;

    // 查找第一个大于target的元素的下标
    int index = binary_search(arr, n, target);
    if (index == -1) {
        printf("Element not found\n");
    } else {
        while (index < n && arr[index] <= target) {
            index++;
        }
        if (index == n) {
            printf("No element found which is greater than %d\n", target);
        } else {
            printf("Element %d is found at index %d\n", arr[index], index);
        }
    }

    return 0;
}

在上述示例中,我们在数组arr中查找第一个大于6的元素的下标,输出结果为:Element 7 is found at index 4

通过以上步骤,我们就可以实现在C语言中使用二分查找算法来查找有序数组中指定元素的功能。

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

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

相关文章

  • redis zset实现滑动窗口限流的代码

    Redis ZSET(有序集合)非常适合实现滑动窗口限流。下面是实现滑动窗口限流的Redis ZSET代码攻略: 步骤一:定义一个键和窗口大小 为了使用Redis ZSET实现滑动窗口限流,您需要为每个限流器定义一个键。键的值将存储在Redis Sorted Set中,并且每个元素将具有其分数。我们将使用时间戳作为分数。此外,需要指定每个限制限流器的窗口大小…

    算法与数据结构 2023年5月19日
    00
  • C++插入排序算法实例详解

    C++插入排序算法实例详解 什么是插入排序算法? 插入排序算法是一种简单直观的排序算法,其基本思想是将待排序的数据插入已排序序列的合适位置,以达到排序的目的。该算法的时间复杂度为 O(N^2),适用于数据量较小的排序场景。 插入排序算法的基本步骤 插入排序算法的基本步骤可以归纳为以下三个: 将待排序序列的第一个元素视作已排序序列,将后面的元素逐个与已排序序列…

    算法与数据结构 2023年5月19日
    00
  • php自定义排序uasort函数示例【二维数组按指定键值排序】

    首先,让我们先了解一下 uasort 函数。uasort 函数是 php 中的一个内置函数,用于对数组进行自定义排序。这个函数和 sort 函数的区别在于,uasort 函数允许我们自定义一个排序函数,在排序时使用这个函数进行排序,而 sort 函数则只能使用默认的排序函数。 下面是一个使用 uasort 函数的示例,演示如何对 PHP 二维数组按照指定键值…

    算法与数据结构 2023年5月19日
    00
  • Java的Arrays.sort()方法排序算法实例分析

    Java的Arrays.sort()方法排序算法实例分析 在Java中,我们可以使用Arrays.sort()方法对数组进行排序。这个方法具有良好的性能和适应性。 然而,不了解其实现原理可能会产生些困惑,我们在这里将从排序算法本身的角度,详细讲述如何使用Arrays.sort()方法并提高其性能。 排序算法 Arrays.sort()方法使用的排序算法是不稳…

    算法与数据结构 2023年5月19日
    00
  • Python 数据结构之十大经典排序算法一文通关

    Python 数据结构之十大经典排序算法一文通关 一、前置知识 在学习本文之前,需要具备以下基础知识: Python 基础语法 算法与数据结构基础 二、十大经典排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 本文将一一讲解这十种排序算法。 三、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历过要排…

    算法与数据结构 2023年5月19日
    00
  • C语言简明讲解快速排序的应用

    C语言简明讲解快速排序的应用 快速排序的概述 快速排序是一种基于比较的排序算法,最初由Tony Hoare于1959年发明,因其在实践中的高效性而受到广泛的应用。快速排序的基本思想是通过不断地分割(partition)和交换(swap)来实现排序,具体来说,就是先选取一个pivot数,然后将序列中小于pivot的数放在pivot左边,大于pivot的数放在p…

    算法与数据结构 2023年5月19日
    00
  • JS中的算法与数据结构之字典(Dictionary)实例详解

    下面我将详细讲解“JS中的算法与数据结构之字典(Dictionary)实例详解”的完整攻略。 什么是字典? 字典是一种存储唯一键和对应值的数据结构,每个键对应一个值。JavaScript 中的对象就是字典的一种实现,通过键值对来存储和访问数据。 字典的操作 字典支持以下几种操作: 添加键值对 删除键值对 查找键值对 获取所有键 获取所有值 字典的实现 下面是…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部