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实现常见的数据结构的完整攻略。 1. 概述 数据结构是计算机程序设计中一个非常重要的概念,常见的有数组、链表、栈、队列、树、图等。本文主要介绍如何使用Go实现常见的数据结构。 2. 数组 数组是最简单、最基本的数据结构之一,它在Go中的实现非常简单,可以用以下代码片段表示: // 定义一个长度为10的整型数组 var arr [10]…

    数据结构 2023年5月17日
    00
  • 二叉搜索树的本质

    引言 打算写写树形数据结构:二叉查找树、红黑树、跳表和 B 树。这些数据结构都是为了解决同一个基本问题:如何快速地对一个大集合执行增删改查。 本篇是第一篇,讲讲搜索树的基础:二叉搜索树。 基本问题 如何在一千万个手机号中快速找到 13012345432 这个号(以及相关联信息,如号主姓名)? 最笨的方案 把一千万个手机号从头到尾遍历一遍,直到找到该手机号,返…

    算法与数据结构 2023年4月17日
    00
  • C语言创建和操作单链表数据结构的实例教程

    C语言创建和操作单链表数据结构的实例教程 什么是单链表 单链表是一种常见的动态数据结构,它由一个个节点组成,每个节点包含范围内的数据和指向下一个节点的指针。单链表通常用于需要频繁插入删除节点的情况。 单链表的创建和操作步骤 创建单链表 定义一个链表节点结构体,结构体中包含要存储的数据和指向下一个节点的指针。 定义一个指向链表头部的指针,如果链表为空,则指针为…

    数据结构 2023年5月17日
    00
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    首先,需要说明的是本题涉及到一个特定的知识领域,即C语言程序设计,以及该领域内某个具体教材的课后习题解答。因此,本攻略的重心将放在如何利用Markdown格式对该领域内的知识进行准确、清晰的表达和展示上。 下面是本攻略的目录: C语言程序设计第五版谭浩强课后答案(第二章答案)攻略 一、简介 二、题目列表 三、示例说明 示例一 示例二 四、总结 一、简介 本攻…

    数据结构 2023年5月17日
    00
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除

    Python数据结构之二叉排序树 一、定义 二叉排序树(Binary Search Tree,BST),也称为二叉查找树或二叉搜索树,是一种基于二叉树的数据结构,其中每个节点都包含一个键值,且满足: 左子树中所有节点的键值均小于当前节点; 右子树中所有节点的键值均大于当前节点; 这是一种自平衡的数据结构,可以快速地进行查找、插入、删除等操作。 二、查找 查找…

    数据结构 2023年5月17日
    00
  • C语言全面梳理结构体知识点

    C语言全面梳理结构体知识点 什么是结构体? 结构体是一种自定义的数据类型,它可以包含多个不同类型的成员变量,并且这些成员变量可以通过一个变量名来访问。结构体的定义需要使用关键字struct,并且需要指定结构体的类型名和成员变量。例如: struct Person { char name[20]; int age; float height; }; 以上代码就…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之递归

    带你了解Java数据结构和算法之递归 什么是递归? 递归是一种算法或计算机程序的设计方法,在程序执行过程中直接或间接的调用自身。 递归的实现方式 递归的实现通常使用函数进行的。在函数中,我们首先检查停止条件(递归基)是否满足,如果满足,我们停止递归;否则,我们调用自身递归进行下一步计算。 递归的应用场景 递归通常在解决问题中使用。对于像树、图等复杂结构的遍历…

    数据结构 2023年5月17日
    00
  • Java数据结构之堆(优先队列)详解

    Java数据结构之堆(优先队列)详解 概述 堆是一种基于树的数据结构,它可以用来解决很多问题,例如排序、优先队列等。在堆中,每个节点的值都小于或等于它的子节点的值。堆分为两种类型:最大堆和最小堆。在最大堆中,根节点的值最大;而在最小堆中,根节点的值最小。 堆的操作主要有以下两种: 插入:将一个元素插入到堆中,需要维护堆的性质,即节点的值小于或等于子节点的值。…

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