news 2026/10/19 2:11:30

快速排序(力扣基础)(递归)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
快速排序(力扣基础)(递归)

核心目标:在无序数组中,不用完全排序,找到第 k 大 / 第 k 小元素

推荐:数据结构合集 - 快速排序(算法过程, 效率分析, 稳定性分析)_哔哩哔哩_bilibili

int quickselect(int[] nums, int l, int r, int k) { if (l == r) return nums[k]; //找到目标,递归终止 // 基准 指针 指针 int x = nums[l], i = l - 1, j = r + 1; while (i < j) { do i++; while (nums[i] < x); //注意区分while(){...} do j--; while (nums[j] > x); //分别找到一个符合要求的 再向右/左移动 if (i < j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } } if (k <= j) return quickselect(nums, l, j, k); else return quickselect(nums, j + 1, r, k); //分成了两个数组分别递归 }

l就是视频中的中轴pivot的下标(注意不是pivot本身),就是随便取一个数当pivot取到了l这个位置的数字

  • l:当前处理区间左边界下标
  • r:当前处理区间右边界下标
  • k:目标下标(我们要找的是数组排序后,下标为k的元素)

难点:

1.思考nums[k]的含义:

即思考此排序是从小到大排的还是从大到小

2.理解下面代码:

do i++; while (nums[i] < x); do j--; while (nums[j] > x);
只要当前元素比基准 x 小,i 就一直右移;遇到≥x 的就停。
只要当前元素比基准 x 大,j 就一直左移;遇到≤x 的就停。
3.遇到之后执行的下面代码啥意思
if (i < j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }

i找到一个大于等于基准 x的数;

j找到一个小于等于基准 x的数。

如果i<j(i 还在 j 左边),说明这两个数站错队了,把它们互相交换。

相当于前面都比较符合预期,不用自己调整就是符合排序的,现在遇到了不符合预期了,才真正需要调整了

4.下面咋理解

if (k <= j) return quickselect(nums, l, j, k); else return quickselect(nums, j + 1, r, k);

怎么就已经分成两段了?

因为在上面while循环执行过后,i应该是 ≥ j 的,所以就依此划分

0-j段递归

i-结尾段递归

注意:上面一部分代码可不是两段分别递归了,而是分段后看k在哪一段就哪一段递归,另一段直接舍弃了(因为根本没必要)

但是如果需要完整排序的话可以另外写完整排序的代码,这里不适配

5.为啥是j+1,为啥不能写成i,或者写成i 和 i-1,这两种情况都直接报错(还不是普通的不全面)

仅仅j+1写成i:StackOverflowError栈溢出

j+1写成i且 j写成i-1:StackOverflowError栈溢出

弄不明白了豆包讲吧https://www.doubao.com/thread/x1tgmG6JTS16FKK5P

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 2:11:28

基于TRL库的SFT微调实现

一.TRL库的介绍 TRL库提供一系列的Trainer&#xff0c;实现大语言模型的微调和对齐训练。 使用TRL进行SFT微调的时候&#xff0c;需要先配置SFTTrainer实例。SFTTrainer包含了所需要训练的model,tokenizer以及SFTConfig参数。配置完成之后&#xff0c;即可调用SFTTrainer实例…

作者头像 李华
网站建设 2026/10/19 2:10:49

Flash 缓存没刷新读旧值——写了缓存未回写,写后 invalidate/回写

Flash 缓存没刷新读旧值——写了缓存未回写&#xff0c;写后 invalidate/回写文章标签&#xff1a;#嵌入式开发 #单片机 #Flash #OTA升级 #STM32 #扇区 #擦写 #缓存 #回写一、开篇&#xff1a;那个"写进去了却读不出"的缓存 做 STM32F7/H7&#xff08;带 DCache/ICac…

作者头像 李华
网站建设 2026/10/19 2:10:10

联调时我当了太久人肉快递员,最后让两个 agent 自己聊上了

开发最耗人的地方&#xff0c;我一直觉得不是写代码。 前几天有个活&#xff1a;一部分功能跑在无影云上&#xff0c;手机插在本地这台 PC 上。做起来是这样——云上跑一遍&#xff0c;看日志&#xff0c;复制结论&#xff1b;切到本地&#xff0c;接上手机&#xff0c;再跑一遍…

作者头像 李华
网站建设 2026/10/19 2:10:07

处理超时未支付订单:两套轻量化方案,附 PHP 极简实现

电商交易类业务&#xff0c;「待支付订单超时自动取消」是个绕不开的需求。用户占着库存、优惠券、活动名额迟迟不付款&#xff0c;不及时释放就是实打实的资损。很多技术人第一反应就是上延迟队列、分布式事务、各种中间件&#xff0c;好像不用点 “高大上” 的技术就不算做架…

作者头像 李华
网站建设 2026/10/19 2:09:29

Qwen3.8-27B 对上 Nemotron 3.5 Bolt、Gemma 4:一张 24GB 显卡该装谁

封面&#xff1a;大数字海报 纸白&#xff0c;数字为 Hugging Face 显示的 Qwen3.8-27B 上月下载量&#xff0c;条形为三家官方公布的 GPQA Diamond 分数&#xff0c;由本号封面脚本生成。 Hugging Face 上赞数最多的千问&#xff0c;不是几百 B 的大模型&#xff0c;而是一个…

作者头像 李华
网站建设 2026/10/19 2:08:28

DMA读旧数据?三招解决Cache一致性问题的核心原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华