排序数组 ---- 分治-快排

题目链接

题目:

分析:

  • 回顾一下快速排序, 快速排序的思想就是找一个基准值key, 按照基准值,将数组分成两块, 分别是<key和>key的区域,然后继续对这两个区域划分, 那么快速排序的时间复杂度是O(N*logN), 但是如果数组中有许多相同的元素, 如果我们选定的基准值就有相同的元素, 而基准值我们只选定了其中一个, 这样会降低排序的效率
  • 所以我们可以按照**"将数组分成三块"** 的思想实现快排, 在处理数据量有很多重复的情况下,效率会大大提升。
  • 找基准值时, 我们要选取随机数, 经过大量的计算, 这样效率最高, 那我们可以生成下标, 就相当于生成了数组中的随机数, 我们要生成的随机下标要在我们所排序的下标范围内方法时:
    int key = numsnew Random().nextInt(r - l + 1) + l;//l和r表示此时需要排序的左右位置
    • 快速排序算法主要流程:
      a. 定义递归出口;
      b. 利⽤随机选择基准函数⽣成⼀个基准元素;
      c. 利⽤荷兰国旗思想将数组划分成三个区域;
      d. 递归处理左边区域和右边区域。

代码:

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

    public void qsort(int[] nums, int l, int r) {
        if (l >= r)
            return;
        int key = nums[new Random().nextInt(r - l + 1) + l];
        int left = l - 1;
        int right = r + 1;
        int i = l;
        while (i < right) {
            if (nums[i] < key) {
                swap(nums, i++, ++left);
            } else if (nums[i] == key) {
                i++;
            } else {
                swap(nums, i, --right);
            }
        }
        qsort(nums, l, left);
        qsort(nums, right, r);
    }

    public void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
相关推荐
其实防守也摸鱼27 分钟前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机43 分钟前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1001 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码1 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ1 小时前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
Rabitebla2 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE42 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6582 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐2 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
Tairitsu_H3 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划