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

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

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

java 复制代码
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.思考numsk的含义:

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

2.理解下面代码:

java 复制代码
do i++; while (nums[i] < x);
do j--; while (nums[j] > x);

只要当前元素比基准 x 小,i 就一直右移;遇到≥x 的就停。
只要当前元素比基准 x 大,j 就一直左移;遇到≤x 的就停。
3.遇到之后执行的下面代码啥意思

java 复制代码
if (i < j){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            }

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

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

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

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

4.下面咋理解

java 复制代码
 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

相关推荐
const_qiu1 小时前
第三章 08:3.10 本章小结
java·人工智能
roman_日积跬步-终至千里1 小时前
【数据Agent论文·分析与报告评测|27】ComInsight:原子洞察正确,组合后的结论就可靠吗?
人工智能·算法·机器学习·数据分析
CarIise1 小时前
Spring MVC 请求参数绑定与常用注解2
java·spring·mvc
七夜zippoe1 小时前
Spring Boot 接通义千问:从拿 Key 到第一个对话接口跑通(保姆级)
java·spring boot·后端
SimonKing1 小时前
别再花钱调 OCR 接口了!这个国产开源工具,免费还能离线跑
java·后端·程序员
Nebula_g1 小时前
SpringBoot企业级实战项目—云禾外卖—SpringBoot常用注解解析
java·网络·数据库·spring boot·后端·spring·javase
const_qiu1 小时前
第三章 07:3.9 能力收束与统一入口
java·人工智能
const_qiu2 小时前
第三章 05:3.7 结构化输出与程序化消费
java·人工智能
Samson Bruce2 小时前
【数学之美】
线性代数·算法·概率论