排序数组(快速排序算法)

目录

一:题目链接

二:题目思路

区域划分:

递归执行:

三:代码实现


一:题目链接

二:题目思路

这题主要由两大思路一起解决,一是 "区域划分" ,二是 "递归执行",现在分别解释这两个思路。

区域划分:

假设现有一个数组,我们在数组随机取一个基准值 key ,然后准备将数组从左到右划分为 < key ,== key, >key 三个区域,如图:

所以,为了完成上图的情况,我们定义left 下标在 -1,right 下标在 n(后面会解释) ,定义一个变量 i 用来遍历这个数组,变量 i 在遍历的过程中会将数组划分为四个区域:

其中区域1为0,left ,区域2为 left + 1,i -1 , 区域3为 i , right - 1 , 区域4为 right , n - 1,区域 1 和区域 2 代表 < key(将 == key 的情况包含了) ,区域 3 代表未遍历的,区域4代表 > key。接下来 i 在遍历时会遇到的三种情况:

当 nums i < key,此时交换 left + 1位置 和 i 位置下标的元素,后续 i++ , left++。

当 nums i == key,直接 i++。

当 nums i > key,此时交换 left + 1位置 和 i 位置下标的元素,后续 right--。(此时 i 位置得到的元素是未知的,所以不能 i++)

现在就解释,所以为什么 left 下标在 -1,right 下标在 n,因为代码完成了交换元素前会进行 left + 1 或 left + 1,防止下标越界。

这一思路总结代码就是:

java 复制代码
        while(i < right) {
            if(nums[i] < key) {
                swap(nums,++left,i++);
            }else if(nums[i] == key) {
                i++;
            }else {
                swap(nums,--right,i);
            }
        }

递归执行:

上述的区域划分只是完成了一次数组按照一个基准值来进行排序得到的三个区域,对划分后区域的子数组重复上述过程,当执行区域划分次数足够多时,就完成了快速排序。

三:代码实现

java 复制代码
    public int[] sortArray(int[] nums) {
        qsort(nums,0,nums.length - 1);
        return nums;
    }

    public static void qsort(int[] nums,int l,int r) {

        //判断
        if(l >= r) {
            return;
        }

        //取基准值
        int key = nums[new Random().nextInt(r - l + 1) + l];

        //主逻辑
        int i = l;
        int left = l - 1;
        int right = r + 1;
        while(i < right) {
            if(nums[i] < key) {
                swap(nums,++left,i++);
            }else if(nums[i] == key) {
                i++;
            }else {
                swap(nums,--right,i);
            }
        }

        //继续分块操作
        qsort(nums,l,left);
        qsort(nums,right,r);
    }

    public static void swap(int[] nums,int a,int b) {
        int c = nums[a];
        nums[a] = nums[b];
        nums[b] = c;
    }
相关推荐
ZealSinger4 分钟前
LangChain4j用AiServices拼Tool
java·rag·ai智能体·langchain4j
无定义_6 分钟前
Codeforces Round 1124 (Div. 2)
算法
vx_Biye_Design13 分钟前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
Sweet锦1 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
垆边人似月.2 小时前
任务混部(200 分档)
算法
言乐62 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
Rnan-prince2 小时前
LeetCode 股票买卖系列:一个动态规划状态机模板通吃四题
leetcode·动态规划
如意猴2 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i2 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
可乐鸡翅yeah_2 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放