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日

相关文章

  • C++数据结构AVL树全面分析

    C++数据结构AVL树全面分析 简介 AVL树是一种二叉搜索树,它通过使树保持高度平衡来提高搜索、插入和删除操作的效率。AVL树本质上是通过在插入和删除节点时旋转子树来保持平衡的。AVL树被认为是最早的自平衡二元搜索树。 AVL树的定义 AVL树是一种满足以下特性的BST: 每个节点都有一个左子树和一个右子树,并且左子树、右子树也是AVL树。 左子树高度和右…

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
  • Java 超详细图解集合框架的数据结构

    下面是完整攻略: Java 超详细图解集合框架的数据结构 简介 集合框架是Java中最基础的数据结构之一,是大部分Java程序员必须掌握的基础知识。这个框架提供了常用的数据结构和算法,包括List、Set、Map等等。本文将带领您从数据结构的角度详细解析Java集合框架中的各种数据结构,让您能够清晰地掌握它们的特点和使用方法。 数据结构 Java集合框架中的…

    数据结构 2023年5月17日
    00
  • Python数据结构之Array用法实例

    Python数据结构之Array用法实例 在Python中,Array是一种很有用的数据结构类型。它可以通过简单的方式存储一系列数据,提供快速的索引访问和高效的操作。本文将详细探讨Python中Array的用法,包括创建Array、插入、删除、修改、查找和遍历等。 创建Array 要创建一个Array,需要使用array模块。在调用前,需要首先导入该模块。A…

    数据结构 2023年5月17日
    00
  • 数据结构 红黑树的详解

    数据结构:红黑树的详解攻略 一、红黑树的定义 红黑树是一种二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树的特征是对于任何有效的红黑树,从根到叶子结点或空子结点的每条路径都包含相同数目的黑色结点。 二、插入操作 对于新插入的节点,将其涂红并插入红黑树中,然后按照二叉搜索树的规则将其插入到红黑树中。 如果父节点是黑色,则不需…

    数据结构 2023年5月17日
    00
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 F.岛屿数量 题目内容 输入格式 输…

    算法与数据结构 2023年4月25日
    00
  • JavaScript 数据结构之集合创建(1)

    当我们在编写JavaScript程序时,有时需要使用数据结构来组织和表示数据。其中之一是集合,它是一组无序且唯一的项的集合。这里就介绍如何在JavaScript中创建集合。 1. 集合定义 集合是一种不同于数组或对象,由一组彼此无关的元素组成的数据结构。集合中的元素是唯一的,即不允许重复元素。 2. 集合的操作 JavaScript中的集合可以支持以下常见操…

    数据结构 2023年5月17日
    00
  • Lua教程(七):数据结构详解

    Lua教程(七):数据结构详解 Lua 中的数据结构广泛应用于各种计算机程序中。本文将详细介绍 Lua 中的数组、列表、栈、队列、集合和字典等数据结构的使用以及相关的函数。 数组 数组是存储在连续内存位置上的相同数据类型的元素集合。Lua 中的数组索引默认从 1 开始。下面是一些常用的 Lua 数组函数: table.concat(arr[, sep[, i…

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