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

yizhihongxing

当实现查找某个元素时,一个常见的算法是二分查找(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日

相关文章

  • PHP排序算法之快速排序(Quick Sort)及其优化算法详解

    PHP排序算法之快速排序(Quick Sort)及其优化算法详解 快速排序是一种高效的排序算法,也是PHP中常用的排序方法之一。在本攻略中,我们将介绍快速排序的基本思想与原理,以及一些优化算法和实际示例。 快速排序基本原理 快速排序的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部…

    算法与数据结构 2023年5月19日
    00
  • JS常见面试试题总结【去重、遍历、闭包、继承等】

    来讲解一下“JS常见面试试题总结【去重、遍历、闭包、继承等】”的完整攻略。 一、去重 JS中去重的方法有很多种,我这里介绍两种比较常见的方法。 1.1 利用Set去重 let arr = [1, 2, 3, 1, 2, 3]; let unique = […new Set(arr)]; console.log(unique); // [1, 2, 3] …

    算法与数据结构 2023年5月19日
    00
  • Python实现的最近最少使用算法

    Python实现最近最少使用算法 最近最少使用算法(Least Recently Used,LRU)是一种缓存淘汰策略,用于在缓存已满时选择要被淘汰的缓存块。该算法的基本思想是,当缓存已满时,淘汰最近最少使用的缓存块。 下面我们将通过python代码实现LRU算法的主要思想,并提供两个示例说明。 算法思路 LRU算法需要同时维护两个数据结构。 记录最近访问顺…

    算法与数据结构 2023年5月19日
    00
  • C++实现冒泡排序(BubbleSort)

    C++实现冒泡排序(BubbleSort)攻略 冒泡排序是一种简单的排序算法,它会重复地比较相邻的两个元素,如果顺序错误就交换它们的位置,直到排序完成。下面是C++实现冒泡排序的步骤。 1. 理解冒泡排序的基本原理 冒泡排序的基本思路是将待排序的数组分为已排序的部分和未排序的部分,先从未排序的部分开始,进行比较相邻元素的大小,并交换位置,直到本轮最大的元素被…

    算法与数据结构 2023年5月19日
    00
  • Go语言展现快速排序算法全过程的思路及代码示例

    这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。 什么是快速排序算法 快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。 快速排序算法的实现思路 下面是快…

    算法与数据结构 2023年5月19日
    00
  • 深入解析Radix Sort基数排序算法思想及C语言实现示例

    深入解析Radix Sort基数排序算法思想及C语言实现示例 什么是基数排序算法 基数排序即Radix Sort,是一种非比较型排序算法。相比于其他排序算法,如快速排序、归并排序等,基数排序的时间复杂度较为稳定,且不受数据规模的影响,适用于数据范围较小但位数较多的序列排序。 基数排序算法思想 基数排序算法的核心思想是按照不同位数上的数字对数据进行排序,从低位…

    算法与数据结构 2023年5月19日
    00
  • Java中的数组排序方式(快速排序、冒泡排序、选择排序)

    下面是Java中的数组排序方式的完整攻略。 1. 快速排序 快速排序是常用的一种排序算法,其时间复杂度为O(nlogn)。其基本思想是选择一个基准数,将数组分成左右两部分,比基准数小的放在左边,比基准数大的放在右边,然后再对左右两部分分别递归地进行快速排序。 Java中快速排序的实现基于Arrays类的sort方法。下面是一个示例代码: public sta…

    算法与数据结构 2023年5月19日
    00
  • c语言排序之归并排序(递归和非递归)

    下面我来为你详细讲解“C语言排序之归并排序(递归和非递归)”的完整攻略: 什么是归并排序 归并排序是一种基于分治策略的排序算法,其基本思想是将原始数据分成若干个小的子序列,然后将这些小的子序列两两合并成为较大的子序列,直到最终合并成为完整的有序序列。 归并排序可以采用递归和非递归两种方式实现。 归并排序递归实现 归并排序的递归实现相对容易理解,可以通过以下步…

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