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

核心目标:在无序数组中,不用完全排序,找到第 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

相关推荐
冻柠檬飞冰走茶42 分钟前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊1 小时前
LeetCode2161~2180题目解析
java·leetcode
雪落漂泊1 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
文丑颜不良啊3 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发3 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力3 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力3 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A4 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵4 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
严肃小白兔4 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab