算法日常・每日刷题--<快速排序>2

912. 排序数组 - 力扣(LeetCode)912. 排序数组 - 给你一个整数数组 nums,请你将该数组升序排列。你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1:输入:nums = 5,2,3,1输出:1,2,3,5解释:数组排序后,某些数字的位置没有改变(例如,2 和 3),而其他数字的位置发生了改变(例如,1 和 5)。示例 2:输入:nums = 5,1,1,2,0,0输出:0,0,1,1,2,5解释:请注意,nums 的值不一定唯一。 提示: * 1 <= nums.length <= 5 * 104 * -5 * 104 <= numsi <= 5 * 104https://leetcode.cn/problems/sort-an-array/

随机基准 + 三路快排

  1. 随机选基准:随机抽取区间内数字作为 pivot,从数学概率上杜绝有序数组退化,平均递归深度稳定 O(logn);
  2. 三路分区 :把区间切分成三段:[l, left] < key、[left+1, right-1] == key、[right, r] > key,等值元素不再参与后续递归,大量重复数据下效率大幅提升;
  3. 原地交换:仅递归栈开销,无额外数组,空间开销极小,贴合题目「空间尽可能小」要求。
三路指针含义
  • left:小于 key 区域的右边界 ,初始 l-1(空区间);
  • right:大于 key 区域的左边界 ,初始 r+1(空区间);
  • i:遍历指针,从头开始扫描未分区元素。
分区循环逻辑
  1. nums[i] < key:交换到左区间,left++,i++(交换过来的数一定小于 key,无需二次校验);
  2. nums[i] > key:交换到右区间,right--,i 不变(交换过来的数字还没判断,需要重新校验);
  3. nums[i] == key:直接跳过,不做任何交换。
cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       srand(time(NULL));
       qsort(nums,0,nums.size()-1);
       return nums;
    }
    void qsort(vector<int>& nums,int l,int r)
    {
        if(l>=r) return;
        int key=getRandom(nums,l,r);
        int i=l,left=l-1,right=r+1;
        while(i<right)
        {
            if(nums[i]<key)
            swap(nums[++left],nums[i++]);
            else if(nums[i]>key)
            swap(nums[--right],nums[i]);
            else i++;
        }
       //l  left  left+1 right  right+1 r
       qsort(nums,l,left);
       qsort(nums,right,r);

    }
    int getRandom(vector<int>& n,int l,int r)
    {
        int x = rand();
        return n[x % (r-l+1) + l];
    }
};
相关推荐
jyOverQ3 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
严肃小白兔5 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
【心态好不摆烂】5 小时前
数据结构基础精讲3
数据结构·算法
岑梓铭6 小时前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408
漂流瓶jz7 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
Pniubi7 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了8 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法
贝壳6909 小时前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法