C语言数据结构之 折半查找实例详解

C语言数据结构之 折半查找实例详解

什么是折半查找?

折半查找是一种在有序数组中查找某个特定元素的算法。其基本思想是将查找的值与数组的中间元素比较,如果比中间元素小,则在数组的左半部分查找;如果比中间元素大,则在数组的右半部分查找,直到找到该元素或查找范围为空。

折半查找算法的流程

  1. 确定要查找的数组arr和其元素个数n,以及要查找的元素value。
  2. 设定左边界low和右边界high初始值,即low=0,high=n-1。
  3. 当low<=high时,执行以下步骤:
  4. 计算中间位置mid = (low + high)/2,取整数部分;
  5. 如果arr[mid] == value,则查找成功,返回mid;
  6. 如果arr[mid] > value,则在左半部分继续查找,即将high = mid - 1;
  7. 如果arr[mid] < value,则在右半部分继续查找,即将low = mid + 1;
  8. 如果查找失败,返回-1。

折半查找的代码实现

int binary_search(int arr[], int n, int value)
{
    int low = 0;
    int high = n - 1;

    while (low <= high)
    {
        int mid = (low + high) / 2;

        if (arr[mid] == value)
        {
            return mid;
        }
        else if (arr[mid] > value)
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }

    return -1;
}

折半查找的示例应用

示例1:在有序数组中查找指定元素

假设有一个有序数组arr,元素值为1、3、5、7、9、11、13、15、17、19,查找元素7,代码如下:

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

int index = binary_search(arr, n, value);

if (index == -1)
{
    printf("查找失败\n");
}
else
{
    printf("查找成功,元素7的下标为%d\n", index);
}

运行结果为:

查找成功,元素7的下标为3

示例2:查找重复元素

折半查找也可用于查找重复元素,在查找到目标元素后可以向左和向右依次比较,查找其他相同的元素。代码如下:

int arr[] = {1, 3, 5, 7, 7, 7, 11, 13, 15, 17, 19};
int n = sizeof(arr) / sizeof(int);
int value = 7;

int index = binary_search(arr, n, value);

if (index == -1)
{
    printf("查找失败\n");
}
else
{
    printf("查找成功,元素7的下标为%d\n", index);
    int i = index - 1;
    while (i >= 0 && arr[i] == value)
    {
        printf("元素7的下标为%d\n", i);
        i--;
    }
    i = index + 1;
    while (i <= n - 1 && arr[i] == value)
    {
        printf("元素7的下标为%d\n", i);
        i++;
    }
}

运行结果为:

查找成功,元素7的下标为3
元素7的下标为2
元素7的下标为4

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之 折半查找实例详解 - Python技术站

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

相关文章

  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • 纯C++代码详解二叉树相关操作

    纯C++代码详解二叉树相关操作 介绍 二叉树是一种非常常见的数据结构,适用于处理需要具有层级关系的数据。在本文中,我们将详细讲解如何使用C++来实现二叉树的基本操作,包括创建、遍历、插入、删除等。 创建二叉树 定义二叉树节点 在C++中实现二叉树的概念,需要先定义二叉树节点的结构,代码如下: struct BinaryTreeNode { int value…

    数据结构 2023年5月17日
    00
  • java数据结构基础:算法

    Java数据结构基础:算法攻略 概述 在程序员的日常开发中,算法是一项重要的技能,而数据结构则是算法不可缺少的基础。本文将讲解Java数据结构中的基本算法,包括常见算法的实现,算法的分析及算法的运用。经过本文的学习,读者可以掌握Java中基础的算法实现及应用。 常见算法实现 排序算法 排序算法是算法中最基础的一类,常用的算法有冒泡排序、插入排序、选择排序、快…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
  • C语言类的双向链表详解

    C语言类的双向链表详解 基本概念 什么是双向链表? 双向链表是链表的一种,它有两个指针域:一个指向前一个结点,一个指向后一个结点。每个结点包含两个部分:数据和指针域,指针域分别指向前一个结点和后一个结点,所以每个结点都是由数据和两个指针域构成的。 双向链表的作用? 双向链表可以支持O(1)时间复杂度的在任何一个结点前或后插入一个结点。 双向链表的实现方式? …

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • Halcon软件安装与界面简介

      1. 下载Halcon17版本到到本地 2. 双击安装包后 3. 步骤如下     界面分为四大块 1.    Halcon的五个助手 1)    图像采集助手:与相机连接,设定相机参数,采集图像 2)    标定助手:九点标定或是其它的标定,生成标定文件及内参外参,可以将像素单位转换为长度单位 3)    模板匹配助手:画取你想寻找的图像,设定参数,可…

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