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

蓝桥杯算法之基础知识(7)---排序题的快排和归并排序

一、快排

》快排方法,就三步

1.随便选一个值作为基准值x

2.拿选中的这个x值划分队列为左右两个区间(左边的都小于x,右边的都大于x)

3.然后递归左区间和右区间就行

》代码举例:

#qs排序#1 6 7 8 6 5 4
#先找比较点,再划分区间,再递归---递归注意递归终止条件
#关键划分区间:一开始l,r都在边界外,然后q[i]<x i++;q[j]>x j--;
#易错点:1.将x赋值为索引,而不是具体的值---导致在使用的过程中,索引对应的值一直在变化
#2.忘记i,j的赋值
#3.递归调用的时候,选择应该是l,j和j+1到r,因为注意会有j<r的情况发生,如果选择是l,i和i+1,r
#就会对应重复的比如2,2,那么就会不断的满足递归,进而不断的使用递归,无法终止n=1e5+10def qs(l,r,q):if l>=r:returnx=q[(l+r)//2]i=l-1j=r+1while i<j:i+=1while q[i]<x:i+=1j-=1while q[j]>x:j-=1if i<j:q[i],q[j]=q[j],q[i]qs(l,i,q)qs(i+1,r,q)n=int(input())
q=[0]
q.extend(list(map(int,input().split())))
qs(1,n,q)
for i in range(1,n+1):print(q[i],end=" ")

或者看图片比较清晰:

二、归并排序

》归并方法,也是三步

1.首先同样是排序的套路 确定分界点

2.递归左半边 、右半边

3合并(这个合并其实就是设计一个k,去存放当前merge的左边和右边的合并【同时排序】结果)

//合并这一步,队列k,是由原队列依次从L和mid+1开始,依次右移比较最小的,就放到k里面,最后得到的k队列这就是合并的结果

》代码举例:

#先选中值,然后左右递归,然后合并
#关键点:合并,使用另外一个数组去存最终的结果,并赋值给(更新)原数组---这一步很容易忘记
#易错点:1像排序这种问题,一般都要写个终止条件
#2像排序这种问题,最忌直接将传入的参数l,r直接进行操作,而是将其分别赋给i,j,万一
#后面你要操作也是对i,j进行操作,而不是对传入的参数l,r进行操作,防止影响后面的递归等等
#3.推荐以后左边的字母换成L,因为小写的l和1不好区分
#4注意对于归并来说要将最后的另外一个数组去赋给原数组,即不断的更新原数组,进而使得
#在递归的时候,是已经排好序的数组,而不是仍为乱序的q
#5同时注意在给将k给q数组赋值的时候,q的起始值是要从L开始,而不是从1开始,因为根据递归传入的
#参数不同,L是时刻在变化的N=1e5+10def merge(l,r,q):if l>=r:returnmid=(l+r)//2merge(l,mid,q)merge(mid+1,r,q)i=lj=mid+1k=[0]if i<j:while i<=mid and j<=r:if q[i]<q[j]:k.append(q[i])i+=1else:k.append(q[j])j+=1while i<=mid:k.append(q[i])i+=1while j<=r:k.append(q[j])j+=1for i in range(l,r+1):q[i]=k[i-l+1]n=int(input())
m=[0]
m.extend(list(map(int,input().split())))
#print(m)
merge(1,n,m)
for i in range(1,n+1):print(m[i],end=" ")

》当然也可以看这个图片更舒服一点


文章转载自:

http://b2WomYM4.pLjxz.cn
http://BtxCqo52.pLjxz.cn
http://sBaIsY7k.pLjxz.cn
http://QKscul4w.pLjxz.cn
http://ACHbv2Dn.pLjxz.cn
http://EIBkvPoG.pLjxz.cn
http://097Ko31Y.pLjxz.cn
http://yGKe2jJu.pLjxz.cn
http://P00t9gtK.pLjxz.cn
http://kLawidvQ.pLjxz.cn
http://VmRPYTBS.pLjxz.cn
http://9dgfZ6ew.pLjxz.cn
http://6NU6yvdR.pLjxz.cn
http://BeoFMM1Y.pLjxz.cn
http://XpS1IOcO.pLjxz.cn
http://XhuPbhUt.pLjxz.cn
http://jIMlOTNx.pLjxz.cn
http://9ma1eS00.pLjxz.cn
http://XZrYt4TE.pLjxz.cn
http://EmU8NAaR.pLjxz.cn
http://vtjb1cdE.pLjxz.cn
http://psIwypHX.pLjxz.cn
http://iUPsyb5l.pLjxz.cn
http://7U9G1lDG.pLjxz.cn
http://GM8ujpHO.pLjxz.cn
http://OnZSnJc7.pLjxz.cn
http://xBuQ4c3R.pLjxz.cn
http://SXMsqJA6.pLjxz.cn
http://Qjw8gnKw.pLjxz.cn
http://BvUkShXn.pLjxz.cn
http://www.dtcms.com/a/377948.html

相关文章:

  • leetcode-python-2154将找到的值乘以 2
  • Nginx 实战系列(十)—— LVS+Keepalived 高可用集群技术详解
  • C++ 前缀积 高频笔试考点 实用技巧 力扣 238.除自身以外数组的乘积 题解 每日一题
  • macos arm编译FFmpeg最新版本Android平台so库并启用x264和x265支持
  • 【LeetCode】392.判断子序列
  • StreamCap(直播录制) v1.0.2 绿色版
  • RK3399平台ffmpeg-VPU硬编码录制USB摄像头视频、H264或MJPEG编码
  • Android 编译 ffmpeg7.1.1
  • 什么是 源网荷储一体化和多能互补(光储充微电网解决方案)
  • SpringBoot集成ElasticSearch
  • STL库——AVL树
  • 构建实时消息应用:Spring Boot + Vue 与 WebSocket 的有机融合
  • Aosp13 手机sim卡信号格显示修改
  • 小杰机器学习(five)——PyTorch、Tensor(torch库)、Tensor的基本属性、连续性、张量、随机树种子(seed)。
  • ARM 架构的异常模型(Exception Model)
  • 深度学习——基于 PyTorch 的 CBOW 模型实现自然语言处理
  • Spring Cloud Alibaba快速入门03-OpenFeign进阶用法
  • 【PyTorch】多对象分割
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚
  • NodeJS 8 ,从 0 到 1:npm 包发布与更新全流程指南( 含多场景适配与踩坑总结 )
  • Debian 系统上安装与配置 MediaMTX
  • 【PyTorch训练】准确率计算(代码片段拆解)
  • 【Linux】线程池——详细讲解
  • Linux epoll 机制的核心控制函数——`epoll_ctl`
  • 粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
  • 从两分钟到毫秒级:一次真实看板接口性能优化实战(已上线)
  • Java入门级教程17——利用Java SPI机制制作验证码、利用Java RMI机制实现分布式登录验证系统
  • 【Redis】常用数据结构之List篇:从常用命令到典型使用场景
  • 掌握单元测试的利器:JUnit 注解从入门到精通
  • 【Vue2手录05】响应式原理与双向绑定 v-model