用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日

相关文章

  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

    算法与数据结构 2023年5月19日
    00
  • Java编程实现汉字按字母顺序排序的方法示例

    下面是关于”Java编程实现汉字按字母顺序排序的方法示例”的详细攻略,包含以下步骤: 一、理解题意及需求 题目要求实现汉字按字母顺序排序,我们需要用到汉字拼音转换工具包,如pinyin4j。同时,我们已知的数据是一个汉字数组,需要对这些汉字进行排序并输出结果。因此,我们需要进行以下步骤: 导入pinyin4j包 对汉字进行拼音转换 对转换结果进行排序 输出结…

    算法与数据结构 2023年5月19日
    00
  • MybatisPlus中的insert操作详解

    MybatisPlus 是 MyBatis 的增强工具包,可以极大地简化 MyBatis 的操作。其中包括许多基础操作,例如insert、update、delete、select等操作。在这里,我们将详细讲解 MybatisPlus 中的 insert 操作。 什么是 MybatisPlus 中的 insert 操作? MybatisPlus 中的 inse…

    算法与数据结构 2023年5月19日
    00
  • input标签内容改变的触发事件介绍

    当用户在表单中输入内容时,网页需要对用户输入进行实时的响应,以方便用户进行修改和确认。而input标签就是常用于表单输入的标签之一,它提供了多种类型的输入框,如文本框、单选框、复选框、下拉框等。在这些输入框中,当其中的内容发生改变时,我们需要将其更新到网页中,这时就需要用到“input标签内容改变的触发事件”。 事件是指在特定的时刻发生的动作或行为,而事件处…

    算法与数据结构 2023年5月19日
    00
  • 如何用JavaScript学习算法复杂度

    下面是关于如何用JavaScript学习算法复杂度的完整攻略: 1. 什么是算法复杂度? 算法复杂度指的是算法运行时间与输入数据规模之间的关系。通常使用大O表示法来表示算法的时间复杂度,即在最坏情况下,算法需要执行的基本操作次数和输入规模n的关系。从时间复杂度的角度出发,我们可以比较不同的算法及其优劣。 2. JavaScript中如何编写算法 JavaSc…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中的排序算法代码

    JavaScript中的排序算法是基于不同的算法实现的,主要包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。下面我们会分别讲解这些算法的具体实现过程,其中包括每个算法的时间复杂度、空间复杂度、优缺点以及关键代码实现。 冒泡排序 冒泡排序是一种交换排序算法,其基本思想是重复地从序列中比较相邻的两个元素,一遍遍地交换相邻逆序的元素。在一趟排序中如果没有进…

    算法与数据结构 2023年5月19日
    00
  • 设计师灵感来源 细数上市公司LOGO背后的含义

    设计师灵感来源 作为设计师,找灵感是创作过程中的一项重要任务,而且好的设计往往都来自于深度的思考和充足的灵感。那么,设计师在哪里寻找灵感呢? 灵感来源 1. 观察 设计师可以通过观察日常生活中的事物来获取灵感,例如自然风光、建筑、图形等。观察中的选择与细节是关键,需要有敏锐的观察力和审美能力。 2. 学习 学习可以让设计师积累更多知识与思想,这也为他们提供了…

    算法与数据结构 2023年5月19日
    00
  • C语言非递归算法解决快速排序与归并排序产生的栈溢出

    下面是详细讲解“ C语言非递归算法解决快速排序与归并排序产生的栈溢出”的攻略: 算法概述 快速排序和归并排序是两种非常常用的排序算法,它们以其高效性受到广泛关注。但是在排序过程中,如果递归调用层数过多,就会出现栈溢出的问题。C语言中的栈大小是有限制的,一般为几MB,当递归层数过多时,占用的栈空间也会越来越大,当栈空间被占满之后,就会导致栈溢出。因此,针对这个…

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