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

相关文章

  • GO语言中常见的排序算法使用示例

    首先感谢你对“GO语言中常见的排序算法使用示例”的关注,下面是一个完整的攻略: GO语言中常见的排序算法 在GO语言中,常见的排序算法包括:冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序等。这些排序算法的具体实现方式有所不同,但都可以在GO语言的标准库中找到相应的方法。 冒泡排序 冒泡排序的基本思路是比较相邻的两个元素,如果它们的顺序错误…

    算法与数据结构 2023年5月19日
    00
  • Python实现希尔排序,归并排序和桶排序的示例代码

    Python实现希尔排序,归并排序和桶排序的示例代码 希尔排序 算法思想 希尔排序是插入排序的一种改进版本,它的基本思想是将待排序的数组分割成若干个子序列,对每个子序列进行插入排序,然后再将整个序列逐步缩小进行排序,直至最后整个序列排序完成。 示例代码 def shell_sort(arr): n = len(arr) gap = n // 2 while …

    算法与数据结构 2023年5月19日
    00
  • C语言中的5种简单排序算法(适合小白)

    C语言中的5种简单排序算法(适合小白) 介绍 排序算法是计算机科学中最基本的算法之一,其主要目的是将一组无序的数据按照一定的规则进行排列。在计算机程序设计中,排序算法是非常常用的操作之一。 本文将会介绍C语言中5种简单的排序算法,这些算法非常适合新手上手学习。 以下是5种简单排序算法的详细介绍和实例代码。 冒泡排序(Bubble Sort) 冒泡排序也是一种…

    算法与数据结构 2023年5月19日
    00
  • 用c语言实现冒泡排序,选择排序,快速排序

    首先我们来讲一下三种基本的排序算法——冒泡排序、选择排序和快速排序,并且给出实现的具体代码。 冒泡排序 冒泡排序是一个非常简单的排序算法,其基本思想是比较相邻两个数的大小,如果前一个数比后一个数大,就将两个数交换位置。通过不断重复这个过程,将最大的数“冒泡”到数组的最后面,这个过程类似于水泡在水中不断冒上来,因此得其名。 具体的实现代码如下: void bu…

    算法与数据结构 2023年5月19日
    00
  • c++冒泡排序详解

    c++冒泡排序详解 本文将对c++中的冒泡排序算法进行详解,并提供两个示例以方便读者理解。 冒泡排序的原理 冒泡排序算法通过不断比较相邻两个元素的大小,如果发现顺序不对就交换它们的位置,经过一次比较后就能确定一个元素的最终位置,再对剩余未排序的元素重复进行相同的操作,直到所有元素按照大小顺序排列完成。它的名字“冒泡”的意思即为像水泡一样,大的元素会一步一步向…

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

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

    算法与数据结构 2023年5月19日
    00
  • JS实现的数组全排列输出算法

    JS实现的数组全排列输出算法,一般使用递归实现,具体步骤如下: 步骤一:编写递归函数 首先我们需要定义一个递归函数 permutation,它的输入参数为两个数组: function permutation(arr, result = []) { // … } 其中,arr 是待排列的数组,result 是排列结果。注意,result 是一个可选参数,第…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】

    JavaScript数据结构与算法之基本排序算法定义与效率比较 概述 排序是计算机科学中最常见的操作之一,是将数据按照一定的顺序重新排列的过程。排序算法被广泛应用于搜索、数据压缩、数据库等领域。JavaScript中常用的基本排序算法有3种:冒泡排序、选择排序和插入排序。本文将详细介绍这三种算法的原理、JavaScript实现以及时间复杂度比较。 冒泡排序 …

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