C语言 数据结构 折半查找(二分查找)

数据结构——折半查找【并插入元素】(C语言) 二分查找(折半查找) #include<stdio.h> #include<stdlib.h> #define MAXSIZE 10010 int RecurSearch(int A[],int low,int high,int key){ int flag=0; while(low<=high){ int mid=(low+high)/2; if(A[mid]==key){ printf("元素下标为. 阅读详情

折半查找:

也称二分查找,它是一种效率较高的查找方法,但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

查找过程:
从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步查找区间为空,则代表查找失败。

折半查找每一次查找都使查找范围缩小一半,与顺序查找相比,很显然会提高查找效率。

数据元素的定义:
typedef int KeyType ;

typedef struct {
    KeyType key;        //关键字域
}ElemType;

typedef struct {
    ElemType *R;        //存放查找表中元素的数组
    int length;         //记录查找表中的长度
}SSTable;
创建查找表:
void Create_List(SSTable *ss){
    int length;
    printf("请输入元素个数:");
    scanf("%d",&length);
    ss->length = length;
    ss->R = (ElemType *)malloc((length + 1) * sizeof(ElemType)); //分配内存
    printf("请依次输入元素:");
    for(int i = 1;i <= length;i++){
        scanf("%d",&ss->R[i].key);
    }
}
排序:

由于上面写的表并非是顺序表,而且为了程序的开放性,设定多一个排序,给表排序。这里利用冒泡排序。

冒泡排序:
是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果为逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上“漂浮”,或者使关键字大的记录如石头一般逐渐往下沉。

void Bubble(SSTable *ss,int length){
    printf("排序后的结果:");
    ss->R[0] = ss->R[1];//哨兵初始值
    for(int i=0;i<length;i++){                //冒泡排序,循环遍历
        for(int j=1;j<length-i;j++){
            if(ss->R[j].key > ss->R[j+1].key) { //交换数值
                int temp;
                temp=ss->R[j].key;
                ss->R[j].key=ss->R[j+1].key;
                ss->R[j+1].key=temp;
            }
        }
    }
    for(int i = 1;i <= ss->length;i++){
        printf("%d  ",ss->R[i].key);
    }
}

最后输出排序结果,检验。

折半查找

置查找区间初值,low为1,high为表长。

当low<=high 时,循环执行:
mid取low和high的中间值;
将给定值x与中间位置记录的关键字进行比较,若相等则查找成功,返回中间位置mid;
若不相等,则利用中间位置记录将表对分前、后两个子表。

唯一注意的是,循环条件是 low<=high,而不是low<high,因为low=high时,查找区间还有最后一个节点,还需要进一步比较。

int Search(SSTable *ss,int x){
    int low = 1,high,mid;
    high = ss->length;
    while (low <= high){
        mid = (low + high) / 2;
        if (ss->R[mid].key == x){
            return mid;
        }
        else if (ss->R[mid].key < x){
            low = mid + 1;
        }
        else if(ss->R[mid].key > x){
            high = mid - 1;
        }
    }
}
完整代码:
#include <stdio.h>
#include <stdlib.h>

typedef int KeyType ;

typedef struct {
    KeyType key;        //关键字域
}ElemType;

typedef struct {
    ElemType *R;        //存放查找表中元素的数组
    int length;         //记录查找表中的长度
}SSTable;

//创建查找表
void Create_List(SSTable *ss){
    int length;
    printf("请输入元素个数:");
    scanf("%d",&length);
    ss->length = length;
    ss->R = (ElemType *)malloc((length + 1) * sizeof(ElemType)); //分配内存
    printf("请依次输入元素:");
    for(int i = 1;i <= length;i++){
        scanf("%d",&ss->R[i].key);
    }
}

//排序
void Bubble(SSTable *ss,int length){
    printf("排序后的结果:");
    ss->R[0] = ss->R[1];//哨兵初始值
    for(int i=0;i<length;i++){                //冒泡排序,循环遍历
        for(int j=1;j<length-i;j++){
            if(ss->R[j].key > ss->R[j+1].key) { //交换数值
                int temp;
                temp=ss->R[j].key;
                ss->R[j].key=ss->R[j+1].key;
                ss->R[j+1].key=temp;
            }
        }
    }
    for(int i = 1;i <= ss->length;i++){
        printf("%d  ",ss->R[i].key);
    }
}

//二分查找法
int Search(SSTable *ss,int x){
    int low = 1,high,mid;
    high = ss->length;
    while (low <= high){
        mid = (low + high) / 2;
        if (ss->R[mid].key == x){
            return mid;
        }
        else if (ss->R[mid].key < x){
            low = mid;
        }
        else if(ss->R[mid].key > x){
            high = mid;
        }
    }
}

int main() {
    SSTable ss;
    int x,location;
    Create_List(&ss);
    Bubble(&ss,ss.length);
    while (1){
        printf("\n请输入需要查找的元素:");
        scanf("%d",&x);
        Search(&ss,x);
        location = Search(&ss,x);
        if (location == 0){
            printf("查找失败!\n");
        } else{
            printf("数据在查找表中的位置为:%d\n",location);
        }
    }
    return 0;
}

在主函数也给一个while的死循环,方便多次查找,不用查找一次运行一次代码。

嘻嘻~如果有错,望指出更正。向大家学习!
最后:这是我一次数据结构作业。

C语言中的二分查找(折半查找)超详细版 阅读详情

相关推荐

数据结构查找---折半查找

折半查找:也称二分查找,是一种效率较高的查找方法。但是他要求被查找线性表必须是顺序存储结构,而且表中元素必须要按关键字有序排列(递增或者递减都可以),以下算法都是将顺序表按从小到大排列。 折半查找的查找过程为,从表的中间位置开始比较,如果相等则返回查找成功,不相等的时候就按照递增或者递减在中间值的左边或者右边再取中间值比较,直到找到相等值或者比较完毕。 建立线性表和结点的代码描述在顺序查找中可以看到,这里只记录了折半查找的代码 折半查找算法描述如下: int Searc...

yyy_yanyueyue的博客 3399

C语言——折半查找法

查找数据位序——折半查找法

m0_69438595的博客 3万+

二分查找_在有序数组快速查找值__C语言

一篇文章教会你 二分查找

a778129656的博客 942

数据结构——二分查找(折半查找)算法详解(C语言)

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。 也就是说,在使用折半查找算法查找数据之前,应该首先把该表的数据按照所查的关键字进行排序 折半查找算法 对静态表查找表{2,5,7,17,23,25,31,35,42,76,88}采用折半查找算法查找关键字为17的关键字的过程为: 如上图所示,指针 low 和 high 分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 low 和 high.

weixin_51781852的博客 3万+

【大话数据结构C语言】52 折半查找和插值查找(按比例查找)

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 折半查找(Binary search),又称作二分查找 它的前提是线性表中的记录必须是关键码有序(通常是从小到大有序),线性表必须采用顺序存储 在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。 ...

CodeAllen嵌入式 2706

c语言面试5(希诺麦田)

在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是。

Pierce110110的博客 1053

c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

C语言数据结构中二分查找递归非递归实现并分析前言:二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,又容易写错。因为总是考虑不全边界问题。用非递归简单分析一下,在编写过程中,如果编写的是以下的代码:#include#includeusing namespace std;int binaty_search(int* arr, ...

weixin_36146057的博客 284

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

C语言复习数据结构之折半查找(二分查找)

二分查找 - 可以利用递归 也可以不用。 我使用的是迭代的方式来进行二分查找 唯一代码块 int binerySearch(int array[], int x, int length){ int l, h, mid; l = 0; h = length; mid = (l + h) / 2; while(l &lt;= h){ if...

人猿进化论 730

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 496

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4647

C语言数据结构__查找__折半查找法(二分查找法)

C语言数据结构__查找__折半查找法(二分查找法) 一、通过建立search函数来访问和查找数据 1、low,high指针分别指向队头和队尾; 2、定义flag来保存 flag = (low+high)/ 2位置; 3、通过比较 数组中flag为止元素value_one 和 需要查找的 find_value; 如果是大于 high = flag-1; 如果是小于 low = flag+1; 如果是等于 返回 flag 保存的位置; 4、若果 l

m0_51894865的博客 398

通讯软件002——快速使用modscan进行modbus调试

快速使用modscan进行modbus调试

zhouwl72的博客 1031

数据结构笔记7:折半查找法(二分查找法)及C语言实现

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。 折半查找算法 对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采用折半查找算法查找关键字为 21 的过程为: 如上图 1 所示,指针 low 和 high 分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 lo...

亦木的博客 1572

解锁 STP 与 SOLIDWORKS 转换密码:工具及迪威在线转换秘籍

STP 文件能够完整地记录 3D 模型的几何形状、尺寸、公差、材料属性等丰富信息,无论是简单的机械零件,还是复杂的装配体,都能精准呈现。而在线转换以迪威模型为例,凭借便捷性、高效性和安全性,为广大 3D 专业技术人员和学生党在无需安装额外软件的情况下,轻松实现格式转换提供了有力支持。在实际工作和学习中,可根据自身具体情况灵活选择合适的转换方式,以确保 3D 设计工作流程的顺畅进行,让创意在不同格式间自由流动并绽放光彩。在 3D 设计与建模的广袤世界里,不同格式文件间的转换常常是连接创意与实现的关键桥梁。

技术说明博主 3444

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6117

c语言折半查找法_数据结构与算法分析之二分查找

什么是二分查找?二分查找(binary search)又叫折半查找,它是一种在有序数组中查找某一特定元素的搜索算法。二分查找必要条件?必须为顺序存储结构;必须按关键字大小有序排列。二分查找原理使用二分查找算法找出arrays数组中8的位置int[] arrays = new int[] {2,8,12,18,20,25,30,37,41,49,61};将有序数组分为三个部分,分别为中间值前(中间值...

weixin_39785081的博客 436

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

数据结构 线性表的(折半查找)二分查找和快速排序 C语言

数据结构 线性表的二分查找和快速排序 C语言

weixin_69491512的博客 959

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。折半查找算法对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采用折半查找算法查找关键字为 21 的过程为: 如上图 1 所示,指针 low 和 high 分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 low 和...

weixin_36074841的博客 1020

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

c语言数据结构对学生信息折半查找,数据结构实训报告-二分查找学生管理实训报告.doc...

数据结构实训报告-二分查找学生管理实训报告吉林工业职业技术学院( 数据结构实训 )( 20~ 2012 学年第 学期)指导教师:专业班级: 计算机3101学生姓名:2011年月日实训项目2实训目的2设计分析2设计方案36使用说明18运行调试18实训心得25参考文献27数据结构实训报告实训项目1. 个人项目:二分法查找演示问题描述要 求line(x1,y1,x2,y2)-画直线;,bar(x...

weixin_36392230的博客 500

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二分查找代码实现及讲解

【代码】二分查找代码实现及讲解。

qq_61877169的博客 203
上一篇: C语言 数据结构 之 顺序查找法
下一篇: 合并成周线、月线、季度线、年线这几个长周期k线的函数---使用掘金量化平台
披星斩月
博客等级 码龄7年 14粉丝 3原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值