学习心得:二分查找

二分查找

基础:查找元素是否出现

#include <stdio.h>
int main() {int a[10]={0,1,1,3,4,5,6,7,8,9},int x;scanf("%d",&x);int l=0,r=9,count=0;while(l<=r){int m=(l+r)/2;if(a[m]==x){count=m;break;}if(a[m]>x){r=m-1;}if(a[m]<x)l=m+1;}printf("%d",count);return 0;
}

高级:查找元素出现次数

当你需要找到目标元素的第一个和最后一个出现位置时,你可以通过稍作修改来实现。以下是一个引导你思路的步骤:

  1. 找到第一个出现位置:
    • 使用标准的二分查找算法找到目标元素。
    • 如果找到目标元素,检查它的前一个元素是否也是目标元素,如果是,则继续在左侧搜索,否则,当前位置就是第一个出现位置。
  2. 找到最后一个出现位置:
    • 同样使用标准的二分查找算法找到目标元素。
    • 如果找到目标元素,检查它的后一个元素是否也是目标元素,如果是,则继续在右侧搜索,否则,当前位置就是最后一个出现位置。
  3. 处理未找到的情况:
    • 如果在第一步找到第一个出现位置时未找到目标元素,或者在第二步找到最后一个出现位置时未找到目标元素,表示目标元素不存在。
#include<stdio.h>
#include<stdlib.h>
void swap(int *m,int *n){int temp=*m;*m=*n;*n=temp;
}
void sort(int n,int a[n],int l,int r){if(l<r) return;int key=a[0],ll=l,rr=r;while(ll!=rr){while(key<=a[rr]&&ll<rr) rr--;while(key>=a[ll]&&ll<rr) ll++;swap(&a[ll],&a[rr]);}swap(&a[l],&a[ll]);sort(n,a,l,ll-1);sort(n,a,ll+1,r);
}
int search(int n,int a[n],int key){int l=0,r=n-1;while(l<=r){int m=(l+r)/2;if(a[m]==key){int rec1=m,rec2=m;while(rec1!=0&&a[rec1-1]==key){rec1--;}while(rec2!=n-1&&a[rec2+1]==key){rec2++;}return rec2-rec1+1;}if(a[m]<key){l=m+1;}if(a[m]>key) {r=m-1;}}return -1;
}
int main(){int n,m;scanf("%d%d",&n,&m);int *a=(int *)calloc(n,sizeof(int));for(int i=0;i<n;i++)scanf("%d",&a[i]);int l=0,r=n-1;sort(n,a,l,r);while(m--){int x;scanf("%d",&x);int count=search(n,a,x);if(count==-1){printf("0");}else{printf("%d\n",count);}}free(a);return 0;
}

bsearch函数(<stdlib.h>)

bsearch常与qsort函数联合使用。bsearch查找成功返回指向该元素的指针。

4个参数:

key 指向要查找的元素

base 指向进行查找的数组

num 数组中元素的个数

size 数组中每个元素的大小,一般用*sizeof()*表示

cmp 比较两个元素的函数,定义比较规则。需要注意的是,查找数组必须是经过预先排序的,而排序的规则要和比较子函数cmp的规则相同。

  1. 整型
int cmp(const void *a, const void *b){return *(int *)a - *(int *)b;//升序
//	return *(int *)b - *(int *)a;//降序
}
  1. 浮点型

需要注意浮点数会存在精度损失的问题,所以我们需要通过比较,来返回1或-1,以确定是增序还是降序。

int cmp(const void *a, const void *b){return ((*(double *)a - *(double *)b)>0?1:-1);//升序
//	return ((*(double *)a - *(double *)b)<0?1:-1);//降序
}
  1. 字符型
int cmp(const void *a, const void *b){return *(char *)a - *(char *)b;//升序
//	return *(char *)b - *(char *)a;//降序
}
  1. 字符串型
   int cmp(const void *a, const void *b){return strcmp((char *)a, (char *)b);//升序//	return strcmp((char *)b, (char *)a);//降序}
  1. 字符串指针数组
int cmp(const void *a, const void *b){return strcmp(*(char **)a, *(char **)b);//升序
//	return strcmp(*(char **)b, *(char **)a);//降序
}
  1. 结构体
//sample 1
struct node{int id;
}s[100]; 
int cmp(const void *a, const void *b){struct node *aa = (node *)a;struct node *bb = (node *)b;return ((aa->id)>(bb->id))?1:-1;//升序
//	return ((aa->id)>(bb->id))?-1:1;//降序
}
//sample 2
struct node{int id;char data;
}s[100]; int cmp(const void *a, const void *b){struct node *aa = (node *)a;struct node *bb = (node *)b;if(aa->id == bb->id)//若id相同,按照data排序 return aa->data - bb->data;else//否则按照id排序 return aa->id - bb->id;//升序
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 查询语句概述

目录 1. Match Query 2. Term Query 3. Terms Query 4. Range Query 5. Bool Query 6. Wildcard Query 7. Fuzzy Query 8. Prefix Query 9. Aggregation Query Elasticsearch 是一个基于 Lucene 的搜索引擎&#xff0c;提供了丰富的查询DSL&#xff08;Domain Specifi…

【2023我的编程之旅】七次不同的计算机二级考试经历分享

目录 我报考过的科目 第一次报考MS Office 第二次报考Web语言&#xff0c;C语言&#xff0c;C语言 第三次报考C语言&#xff0c;C语言&#xff0c;Java语言 分享一些备考二级的方法 一些需要注意的细节 结语 2023年的CSDN征文活动已经进入了尾声&#xff0c;在这最后我…

Excel·VBA合并工作簿2

其他合并工作簿的方法&#xff0c;见之前的文章《ExcelVBA合并工作簿》 目录 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总举例 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总 与之前的文章《ExcelVBA合并工作簿&#x…

006.Oracle事务处理

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

vue2 点击按钮下载文件保存到本地(后台返回的zip压缩流)

// import ./mock/index.js; // 该项目所有请求使用mockjs模拟 去掉mock页面url下载 console.log(res, res)//token 是使页面不用去登录了if (res.file) {window.location.href Vue.prototype.$config.VUE_APP_BASE_IDSWAPI Vue.prototype.$config.VUE_APP_IDSW /service/mode…

【Linux上创建一个LVM卷组,将多个物理卷添加到卷组中使用】

Linux上创建一个LVM卷组&#xff0c;将多个物理卷添加到卷组中使用 目录1.列出当前系统中所有的块设备信息&#xff0c;包括磁盘、分区、逻辑卷等2.对磁盘进行分区操作3.创建了一个名为 vg_data 的卷组4.将物理卷添加到已经存在的卷组5.在卷组中创建一个逻辑卷6.查看已创建的 L…

CGAL 网格布尔运算(差集)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 与网格的差集相同,我们这里仍然使用精确点来实现两个网格的差集计算。 二、实现代码 #include <iostream> #include <iterator> #include <map></

CodeWave智能开发平台--03--目标:应用创建--10初级采购管理系统总结

摘要 本文是网易数帆CodeWave智能开发平台系列的第14篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成10初级采购管理系统总结 CodeWave智能开发平台的14次接触 CodeWave参考资源 网易数帆CodeWave…

git-clone的single-branch操作回退

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 最近使用git越来越多&#xff0c;一些git的功能使用也更熟悉了一些。 之前使用了single-branch下载分支&#xff0c;后来想取消掉&#xff0c;但怎么做呢&#xff0c;查了一些资料之后&#xff0c;了解到了怎么做&#x…

【C++】string的基本使用

从这篇博客开始&#xff0c;我们的C部分就进入到了STL&#xff0c;STL的出现可以说是C发展历史上非常关键的一步&#xff0c;自此C和C语言有了较为明显的差别。那么什么是STL呢&#xff1f; 后来不断的演化&#xff0c;发展成了知名的两个版本&#xff0c;一个叫做P.J.版本&am…

【鸿蒙4.0】详解harmonyos开发语言ArkTS

文章目录 一.什么是ArkTS&#xff1f;1.ArkTS的背景2.了解js&#xff0c;ts&#xff0c;ArkTS的演变js(Javascript)Javascript的简介Javascript的特点 ts(Typescript)ArkTS 二. ArkTS的特点 一.什么是ArkTS&#xff1f; 1.ArkTS的背景 如官方文档所描述&#xff0c;ArkTS是基…

Ubuntu使用docker-compose安装mysql8或mysql5.7

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;十四&#xff09;——使用docker-compose安装mysql8或mysql5.7 文章目录 Ubuntu系统环境搭建&#xff08;十四&#xff09;——使用docker-compose安装mysql8或mysql5.7MySQL81.新建文件夹2.创建docke…

【问题记录】Linux下克隆git项目到本地

1.出现远端克隆git上代码失败 &#xff08;1&#xff09;公钥有问题 linux下git生成公钥失败 解决方法&#xff1a; 删除.ssh下全部的文件&#xff0c;并重新设置用户名和邮箱再重新生成ssh公钥 &#xff08;2&#xff09;在询问是不是要把远端地址加入到konw_host中&#x…

【高等数学之牛莱公式】

一、深入挖掘定积分 二、变限积分 三、变限积分的"天然"连续性 四、微积分基本定理 五、定积分基本方法 5.1、换元法 5.2、分部积分法 六、定积分经典结论 七、区间再现公式 八、三角函数积分变换公式 九、周期函数积分变换公式 十、分段函数求定积分

python requests模块

目录 一&#xff1a;介绍 二&#xff1a;发送get请求 三&#xff1a;发送post请求 四&#xff1a;发送put请求 五&#xff1a;发送delele请求 六&#xff1a;响应信息 一&#xff1a;介绍 requests 是 Python 中的一个非常流行的 HTTP 客户端库&#xff0c;用于发送 HTTP…

Python 爬虫 之 抖音视频采集

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests pip install requests 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install …

论文阅读笔记AI篇 —— Transformer模型理论+实战 (四)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;四&#xff09; 一、理论1.1 理论研读1.2 什么是AI Agent? 二、实战2.1 先导知识2.1.1 tensor的创建与使用2.1.2 PyTorch的模块2.1.2.1 torch.nn.Module类的继承与使用2.1.2.2 torch.nn.Linear类 2.2 Transformer代…

大模型学习第六课

学习目标&#xff1a; OpenCompass 大模型评测 学习内容&#xff1a; 模型评测掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#xff1a; 20240120 学习产出&#xff1a; 为什么需要评测&#xff1a;普通用户&#xff0c;开发者&#xff0c;管理机构&…

k8s源码阅读:Informer源码解析

写在之前 Kubernetes的Informer机制是一种用于监控资源对象变化的机制。它提供了一种简化开发者编写控制器的方式&#xff0c;允许控制器能够及时感知并响应 Kubernetes 集群中资源对象的变化。Informer通过与Kubernetes API服务器进行交互&#xff0c;通过监听API服务器上资源…

Idea 开发环境不断切换git代码分支导致冲掉别人代码

问题分析 使用git reflog查看执行命令&#xff0c;以下是发生事故的切换和提交动作 46f72622e1 HEAD{41}: commit: feat: 【Sales - 6.3】小程序端不登录也可以录入客户线索 c5e7d9f6e1 HEAD{42}: fetch origin feature/20240102_Sales6.3_xingang:feature/20240102_Sales6.3…