当前位置: 首页 > news >正文

C语言| 数组的折半查找

数组的折半查找
折半查找:在已经排好序的一组数据中快速查找数据。
先排序,再使用折半查找。

【折半查找的运行过程】
1 存储数组下标 low最小的下标,mid中间的下标, high最大的下标

2 key存放查找的值,每一次对比后,都需要更新mid,而mid = (low+high)/2

3 把key和a[mid]进行对比,key>a[mid],往右边找
low = mid+1, 更新mid=(low+high)/2,high不变

4 再把key和新的a[mid]比较,key<a[mid],往左边找
high = mid-1,更新mid=(low+high)/2,low不变

5 找到了数字,结束程序
6 当low == high,而a[mid]也不是要找的数字,说明不存在,结束程序。


【查找数字256】
1 定义一个变量key,存放要查找的数字256
2 定义变量low存储数组最小下标 mid中间下标 high最大下标
low = 0, mid = (low+high) / 2, high = 7;

3 此时a[2]=87,而key > a[2]=87,说明256在87的右边,则往右边查找
low = mid+1 = 3; 更新mid, mid=(low+high)/2=5;

4 此时a[5]=365,而key<365,说明256在365的左边,继续往左边查找
high = mid-1 = 4, mid=(low+high)/2=3,low=3;

5 此时a[3]=96,而key>96,说明256在96的右边,则往右边查找
low = mid+1 = 4, mid =(low+high)/2=4, high=4;

6 此时a[4]=256,找到了这个数字,结束程序。


【查找数字87】
1 key= 87, low=0, high=7, mid =(low+high)/2=3;

2 此时a[3]=96,而key<96,说明87在96左边,则往左边查找
high = mid-1 = 2, 更新mid =(low+high)/2=1

3 此时a[1]=54,而key>54,说明87在54的右边,则往右边查找
low = mid+1 =2, 更新mid =(low+high)/2=2

4 此时a[2]=87=key,找到了这个数字,结束程序。


【查找的数字不在数组中,查找111】
1 key=123, low=0, high=7, mid=(low+high)/2=3

2 此时a[3]=96,而key>96, 说明111在96的右边,则往右边查找
low = mid+1=4, 更新mid=(low+high)/2=5;

3 此时a[5]=365,而key<365,说明111在365的左边,则往左边查找
high = mid-1=4, mid=(low+high)/2=4

4 此时low == high, 而a[4]=256,不是我们需要查找的数,说明不存在。

【运行结果】

 

【程序代码】

#include <stdio.h>

int main(void)
{
    int a[] = {13, 54, 87, 96, 256, 365, 666, 888};
    int key; //存放要查找的数字

    int low = 0; // 存储数组的最小下标
    int high = sizeof(a)/sizeof(a[0]) -1; // 数组的最大下标
    int mid; //指向中间元素
    int flag = 0; //标志位,用于判断是否存在要找的数

    printf("请输入您想查找的数:");
    scanf("%d", &key);

    while((low <= high))
    {
        //每比较一次,都需要更新mid,所以放在while循环里
        mid = (low+high) / 2; 
        
        if(key < a[mid])
        {
            high = mid-1; //往左边找
        }
        else if(a[mid] < key)
        {
            low = mid + 1; //往右边找
        }
        else
        {
            printf("下标 = %d\n", mid); //找到数字
            flag = 1; //说明数组中存在查找的数字
            break; //跳出循环
        }
    }

    //循环结束后也没找到数,说明不存在
    if(flag == 0)
    {
        printf("Sorry, data is not found.\n");
    }

    return 0;
}

相关文章:

  • DM8的列存储HUGE表
  • java基于ssm+jsp 母婴用品网站
  • QT_day1
  • jnp.diag
  • 09-axios在Vue中的导入与配置
  • SGPT论文阅读笔记
  • 周末总结(2024/06/22)
  • 14K屏FPGA通过MIPI接口点亮
  • 编程书籍的枯燥真相:你也有同样的感受吗?
  • 什么是距离选通型水下三维激光扫描仪?(下)
  • AU音频重新混合音频,在 Adobe Audition 中无缝延长背景音乐,无缝缩短BGM
  • Markdown基础教程
  • 用AI绘画-Stable Diffusion稳定生成指定人物的2-3人场景图,制作小说配图从未如此轻松!
  • 【经验分享】RT600 serial boot mode测试
  • textarea标签改写为富文本框编辑器KindEditor
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • css属性的继承、初识值、计算值、当前值、应用值
  • github从入门到放弃(1)
  • k个最大的数及变种小结
  • PHP的Ev教程三(Periodic watcher)
  • Python学习之路13-记分
  • Ruby 2.x 源代码分析:扩展 概述
  • spring boot 整合mybatis 无法输出sql的问题
  • spring boot下thymeleaf全局静态变量配置
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • tensorflow学习笔记3——MNIST应用篇
  • v-if和v-for连用出现的问题
  • 电商搜索引擎的架构设计和性能优化
  • 回顾2016
  • 离散点最小(凸)包围边界查找
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 延迟脚本的方式
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Java总结 - String - 这篇请使劲喷我
  • #Linux(Source Insight安装及工程建立)
  • (175)FPGA门控时钟技术
  • (31)对象的克隆
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第27天)Oracle 数据泵转换分区表
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)Neo4j下载安装以及初次使用
  • (转)VC++中ondraw在什么时候调用的
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .md即markdown文件的基本常用编写语法
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖