基础算法(排序、二分、精度运算)

news2024/11/26 14:45:05

这里写目录标题

  • 排序
    • 快速排序
      • 主要思想
      • 解法
      • 其它细节
    • 归并
      • 主要思想
      • 解法
    • STL - sort
    • 总结时间效率
  • 二分
    • 整数二分
      • 主要思想
      • 解法
      • 举例:
        • 起始位置
        • 结束位置
    • 浮点数二分
      • 解法
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

排序

快速排序

主要思想

在这里插入图片描述

解法

1、暴力
在这里插入图片描述
开辟新数组 遍历之后 将小的放在一个数组里 大的放在一个数组里 最后将两个数组合并到总数组里

2、双指针
在这里插入图片描述
i在左边 j在右边 二者同时向中间移动 但i的值大于等于x时 就停下 j的值小于等于x时 就停下 两个都停下之后 交换两个的值 之后 两者再次同时向中间移动 然后继续这个过程 直到i到了j的右边(或者说j 到了i 的左边)
在这里插入图片描述

模板:
在这里插入图片描述
main函数中 第一次调用模板时 传入 0 n-1(也就是两个边界的下标)因为是向函数传入左右边界值以供使用 参数就是 l r

模版就是那个quick_sort函数
第一行是判断边界 如果里面没有数 或者只有一个数 那么直接return

之后选定left为分界点 之后初始化i 和 j的位置

然后在while循环里 进行do … while 循环
第一个do i++;while (q[i]<x)意思是只要q[i]<x 那么就会一直在这一行执行 也就是i会一直++
第二个就是 只要满足 q[j]>x 那么就会让j–

之后再判断(i<j)交换 i j 所指向的数据 因为只有上面两个do … while跳出 才能到if 所以这里是指 i j 都停下了 进行if判断并交换 符合解题逻辑

最后递归 依次递归左边区间以及右边区间 以 j 为分界点
quick_sort(q,l,j);
quick_sort(q,j+1,r);

(注意 当递归时传入j时 (例如第一个递归的第三个参数)上面的int x后面必须是q【l】 一定不可以是r)

其它细节

在这里插入图片描述
这个表示一百万 100 0000 + 10
所以一百万就是 1e6
+10 是因为预留一些空间 防止越界

在这里插入图片描述
根据题目的数据范围 来定义数组的大小

归并

主要思想

在这里插入图片描述
在这里插入图片描述
首先是两个有序的序列数组 从小到大排列 之后两个指针依次指向两个数组的最小值 也就是最左端 然后比较两个指针的值 将较小值放入res数组 然后谁放入了res 谁的指针后移一位 之后 再次比较 直到某个指针到了最后 那么进行完这次比较之后 将另一个没有比完的数组 依次接在res的最后
在这里插入图片描述
当两个数相同时 一般是让第一个序列的指针所指的数放入res

快排以及归并的时间复杂度 都是n*log n在这里插入图片描述

解法

模板:
在这里插入图片描述
首先传入q 0 n-1 也就是数组 左边界 右边界

之后在merge_sort函数里面

第一行 判断边界

之后确定分界点 使用 l + r / 2 可以写成 l + r >> 1 这样更快一些

紧接着就分成两个数组 递归调用 以mid为分界点 l mid 以及 mid+1 r

之后 开始合并 首先要定义一个k 用来记录tmp数组的下标 之后i指向l j指向mid+1 也就是都指向两个数组的第一个位置
while循环:当i j 都没出去最后时 循环继续 if 选出较小值 放入临时数组tmp
当第一个循环结束 进入第二个循环 这时 已经有其中一个数组比较完了 所以 就判断是谁还有值 将剩下的值拼接到tmp数组后面即可

最终for循环 将tmp数组的数赋值回q数组 因为最后输出的是q数组 如果不想赋值 直接该输出函数是tmp即可

STL - sort

#include
在这里插入图片描述
传入两个指针 指向第一个元素以及最后一个元素 用数组名代替首元素指着 之后q+n指向了最后一个元素

总结时间效率

在这里插入图片描述
快速排序 归并排序 STL-sort 三者时间差不多

二分

整数二分

主要思想

在这里插入图片描述

在这里插入图片描述
图中两个指针所指的点 可以认为是两个目标点 左边是红色区间边界点 右边是黄色区间的边界点
假如要找红色的那个点 那么就是第一种情况 首先让mid = r + l >> 1
之后 看mid是否满足在红色区间 如果在 那么目标值红点在mid右边 所以mid左边可以丢掉 但是mid不能丢掉 因为mid在有效区间内 所以 L = mid

如果mid不满足在红色区间 那么目标值在mid左边 并且mid在绿色区间 不可能取到目标值 所以直接丢掉mid右边以及mid r=mid-1

然后这个就是下面“解法一栏”的第二个模板 看到 L=mid的更新 就回过头把mid改成 r+l +1 >> 1
在这里插入图片描述
假如要找绿色区间边界点 简称绿点 也就是把绿点当做目标值 首先让mid= r + l >> 1
之后 看mid是否满足绿色区间 如果满足 那么目标值在mid左边 那么 更新r=mid
else mid在红色区间 目标值在mid右边 更新 l = mid +1

解法

模板:
在这里插入图片描述
思考过程
首先 先写mid = l + r >> 1
之后写check()函数 或者直接判断也可以 总之要有一个判断mid在目标值左还是右
之后看满足第一种情况还是第二种
如果是更新了 l=mid 那么回过头来修改mid 在mid的分子上 + 1
如果是更新了 r=mid 那么就无需修改mid

举例:

在这里插入图片描述
这里让找每个查询元素的起始位置以及终止位置 那么 我们这里只看某一个查询元素即可

起始位置

在这里插入图片描述
首先来找起始位置:
对于一个x 假设我们定性质为 >=x
这样就符合找绿点的情况
在这里插入图片描述
最外层while是指m个查询 所以循环体里就是一个查询的代码
目标值用一个变量表示 因为一般都是程序来输入目标值 我们来查找

首先 初始化 l 和 r 的位置 分别是 0 n-1
之后while(l<r)循环条件是l<r 因为当l = r时 就是要找的值
在小循环里 首先定义mid
之后因为要查询绿点 所以 q[mid] >= x
如果为真 那么 r = mid
else l = mid + 1

结束位置

之后找右边坐标 可以理解为右边界
在这里插入图片描述
在这里插入图片描述
这里插播一下无解的情况 如果最后的结果不是x (如果不是 那么q【l】的值就是>x的第一个值 ) 那么就是无解 直接返回无解的值
在这里插入图片描述
这里就是找红点的情况
首先check就是q【mid】<=x 更新 l = mid
else r = mid - 1
这里看到更新的是 l = mid
所以回去修改mid = r + l + 1 >> 1

最后输出 l 其实输出 l 还是 r 都一样 因为 循环最后跳出的条件就是 l = r

浮点数二分

解法

在这里插入图片描述
在这里插入图片描述
这里无需考虑边界问题 当设定的条件是 mid在目标值右边 更新r = mid
否则 更新 l = mid

循环条件:
如果要求输出六位小数 那么循环条件是 r - l > 1e-8
如果要求输出四位小数 那么循环条件是 r - l > 1e-6

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

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

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

相关文章

Wnmp服务安装并结合内网穿透实现公网远程访问——“cpolar内网穿透”

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

【公益案例展】 温州市人民检察院——公益诉讼智能研判预警应用案例

‍ 数澜科技公益案例 本项目案例由数澜科技投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来&#xff0c;智慧检务已成大势所趋&#xff0c;《“…

【Linux】七、基础IO

预备知识 文件 属性&#xff08;本质上也是数据&#xff09;内容&#xff1b; 文件的所有操作大致有两种&#xff0c;对内容的操作&#xff0c;和对属性的操作&#xff1b; 文件在磁盘中放置&#xff0c;磁盘是硬件&#xff0c;只有操作系统可以真正的访问磁盘&#xff1b;C\C…

【Matplotlib】plt.plot() X轴横坐标展示完整整数坐标

比如说&#xff0c;我的数据应该是 x轴从2到21的20个整数 y轴对应值 但是直接plot的话x轴显示居然有小数点什么鬼 可以这样改

四维轻云如何实现地理空间数据在线管理、编辑及分享?

四维轻云是一款轻量化的地理空间数据网页管理平台&#xff0c;支持多种地理空间数据的在线管理、编辑及分享。现阶段&#xff0c;平台具有项目管理、数据上传、场景搭建、发布分享、团队成员、素材库等功能模块&#xff0c;支持项目团队成员在线协作管理&#xff0c;能够在线管…

Python---capitalize() 方法---把字符串的首字母大写,其他字符全部小写

capitalize 英 /ˈkpɪtəlaɪz/ v. 用大写字母书写&#xff08;或印刷&#xff09;&#xff0c;把……首字母大写&#xff1b;为&#xff08;开办或发展企业&#xff09;提供资金&#xff1b;&#xff08;将资产或股票&#xff09;变现&#xff0c;使资本化&#xff1b;&…

win11下使用VMmare设置CentOS7里面的静态IP

1&#xff0c;win11上的VMware 8 设置 2&#xff0c;选择VMmare上的虚拟网络编辑进行设置 #3&#xff0c;接下来进入虚拟机设置&#xff08;就是进入CentOS7 打开终端 右键 Open Terminal &#xff09; # 切换root su root #ksana #编辑网络配置文件 vi /etc/sysconfig/networ…

visual studio Python 配置QGIS(qgis)教程

visual studio Python 配置QGIS&#xff08;qgis&#xff09;教程 这个教程全网独一份啊&#xff0c;博主是自己摸索出来的。 visual studio Python 配置QGIS&#xff08;qgis&#xff09;环境一共分为两部&#xff1a; 第一步安装QGIS&#xff1a; 下载链接如下 https://www…

Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]

一、什么是快速排序算法 快速排序的基本思想是选择一个基准元素&#xff08;通常选择最后一个元素&#xff09;将数组分割为两部分&#xff0c;一部分小于基准元素&#xff0c;一部分大于基准元素。 然后递归地对两部分进行排序&#xff0c;直到整个数组有序。这个过程通过 par…

数据的备份和恢复

数据的备份和恢复 备份&#xff1a;完全备份 增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 备份的需求 1、在生产环境中&#xff0c;数据的安全至关重要、任何数据的丢失都可…

【10套模拟】【2】

关键字&#xff1a; 哈希函数解决问题、进栈、无向图边与度、双向链表插入新结点、折半查找判定树ASL、孩子兄弟表示法、树变二叉、快排partiction划分

十大排序算法C++实现

分类 复杂度 排序稳定性定义&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;A1A2&#xff0c;且A1在A2之前&#xff0c;而在排序后的序…

Django初窥门径-oauth登录认证

引言 在现代Web应用程序中&#xff0c;用户身份验证和授权是至关重要的组成部分。Django&#xff0c;一个流行的Python Web框架&#xff0c;为用户身份验证提供了内置支持。本文将探讨如何创建和注册Django应用&#xff0c;自定义身份验证服务&#xff0c;配置AUTHENTICATION_…

网络数据包传感器简化流量监控

数据包捕获基于数据包镜像的概念&#xff0c;可用于深度数据包检查、测量应用程序的响应时间以及监视服务器、网络和用户行为&#xff0c;该技术还可用于对需要特定信息的某些区域进行广泛分析&#xff0c;尽管它有效&#xff0c;但并非在所有情况下都是必要的。要分析和管理流…

【MogDB/openGauss误删未归档的xlog日志如何解决】

在使用MogDB/openGauss数据库的过程中&#xff0c;有时候大量业务&#xff0c;或者导数据会导致pg_xlog下的日志数量持续增长&#xff0c;此时如果xlog的产生频率太快&#xff0c;而来不及自动清理&#xff0c;极有可能造成pg_xlog目录的打满。如果对数据库的xlog不太了解的时候…

HTTP 协议详解-上(Fiddler 抓包演示)

文章目录 HTTP 协议HTTP 协议的工作过程HTTP 请求 (Request)认识URL关于 URL encode认识 "方法" (method)GET 方法POST 方法其他方法请求 "报头" (header)请求 "正文" (body) HTTP 响应详解状态码响应 "报头" (header) HTTP 协议 HTT…

仪表盘 gauge

option {tooltip: {formatter: {a} <br/>{b} : {c}%},series: [{name: Pressure,type: gauge,startAngle: 225, // 起始角度&#xff0c;同极坐标endAngle: -45, // 终止角度&#xff0c;同极坐标// axisLine: {// //坐标轴轴线// show: false// },// splitLine: {//…

RT-Thread 10. 使用keil4编译GD32F450

1. 修改keil路径 2.增加MCU型号宏定义 3. 在ENV界面输入 scons -c scons --targetmdk44. 编译 scons --verbose提示错误 Warning: L6310W: Unable to find ARM libraries. Error: L6411E: No compatible library exists with a definition of startup symbol __main. Finish…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

C/C++数的输入输出 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C数的输入输出 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C数的输入输出 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个整数和双精度浮点数&#xff0c;先将浮…