【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(60)

1. 题目解析

题目链接:912. 排序数组

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

算法思路:

快速排序作为一种经典的排序算法,其核心思想在于通过“分而治之”的策略,将数据划分为不同的部分,并递归地对这些部分进行排序。其中,最关键的步骤是Partition(分区),即按照某个基准元素将数组划分为左右两部分,左侧元素小于基准,右侧元素大于基准。

在处理含有大量重复元素的数据集时,常规的快速排序算法效率可能会受到影响。因此,我们可以借鉴“荷兰国旗问题”的解决思路,将数组进一步细分为左、中、右三部分:左侧存放小于基准的元素,中间存放与基准相等的元素,右侧存放大于基准的元素。随后,我们只需对左侧和右侧的元素进行递归排序,而无需处理中间的大量重复元素,从而显著提高算法效率。

算法流程:

  1. 定义递归出口
    • 当待排序的数组区间长度小于等于1时,认为该区间已排序完成,无需继续处理。
  2. 随机选择基准元素
    • 为了避免最坏情况的发生(如数组已部分有序或完全有序),我们采用随机选择基准元素的方法。
    • 初始化一个随机数生成器,生成一个随机数。
    • 将随机数转换为数组下标,通过取模运算和加上区间左边界的方式,确保下标在待排序区间的范围内。
    • 使用该下标对应的元素作为基准元素。
  3. 利用荷兰国旗思想划分数组
    • 初始化三个指针:left、mid、right,分别指向区间的最左端、最右端以及当前遍历的位置。
    • 从left开始遍历数组,根据当前元素与基准元素的大小关系,移动left、mid、right指针,并将元素交换到正确的位置。
    • 遍历结束后,数组被划分为左、中、右三部分。
  4. 递归处理左边区域和右边区域
    • 对左边区域(小于基准元素的部分)递归调用快速排序算法。
    • 对右边区域(大于基准元素的部分)递归调用快速排序算法。
    • 注意,中间与基准相等的部分无需处理,因为它们已经处于正确的位置。

3.代码编写

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)i++;elseswap(nums[--right], nums[i]);}// [l, left] [left + 1, right - 1] [right, r]qsort(nums, l, left);qsort(nums, right, r);}int getRandom(vector<int>& nums, int left, int right) {int r = rand();return nums[r % (right - left + 1) + left];}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hbase-2.2.7分布式搭建

一、下载上传解压 1.在官网或者云镜像网站下载jar包 华为云镜像站&#xff1a;Index of apache-local/hbase/2.2.7 2.上传到linux并解压 tar -zxvf hbase-2.2.7-bin.tar.gz -C /usr/locol/soft 二、配置环境变量 1. vim /etc/profile export HBASE_HOME/usr/local/soft/h…

线性代数---行列式的性质

1. 行列式的行与列(按原顺序)互换

Ansible在macOS上的安装部署

一、安装 Ansible&#xff08;使用 Homebrew&#xff09; 安装 Homebrew&#xff08;如果尚未安装&#xff09;&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"使用 Homebrew 安装 Ansible&#x…

OpenHarmony网络请求库-httpclient

简介 HTTP是现代应用程序通过网络交换数据和媒体的的主要方式。httpclient是OpenHarmony 里一个高效执行的HTTP客户端&#xff0c;使用它可使您的内容加载更快&#xff0c;并节省您的流量。httpclient以人们耳熟能详的OKHTTP为基础&#xff0c;整合android-async-http&#xf…

【图像分割】光流生成标签(matlab)

文章目录 1. 框架2. opticalFlow_label3. 光流 1. 框架 2. opticalFlow_label close all; clear; clc; % 使用光流进行标签的生成 %% 视频帧的读取 npy_data readNPY(train.npy);%% 提取标签的坐标 first_label squeeze(npy_data(2,1,:,:)); h fspecial("gaussian&quo…

基于Ultrascale+系列GTY收发器64b/66b编码方式的数据传输(二)——Sync Gearbox使用及上板测试

基于Ultrascale系列GTY收发器64b/66b编码方式的数据传输&#xff08;一&#xff09;——Async Gearbox使用及上板测试 一文介绍了64B/66B编码方式及如何使用GTY IP核提供的Async Gearbox进行64B/66B数据传输&#xff0c;由于Async Gearbox方式下无法使用buffer bypass方式提供的…

阿里云服务器上配置Docker 以及常用命令讲解

目录 一、认识docer二、在阿里云服务器上配置Docker三、底层原理4、常用命令&#xff08;1&#xff09;Docker中常见镜像命令&#xff08;2&#xff09;Docker中常见容器命令&#xff08;3&#xff09;日志查看命令&#xff08;4&#xff09;进入容器的命令与拷贝命令 一、认识…

【三维Dvhop定位】基于麻雀搜索算法的多通信半径和跳距加权的三维Dvhop定位算法【Matlab代码#81】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. Dvhop定位算法2. 麻雀搜索算法3. 多通信半径和跳距加权策略3.1 多通信半径策略3.2 跳距加权策略 4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

函数 基础知识

本笔记为观看 50 函数-函数的定义_哔哩哔哩_bilibili的学习笔记 1 函数概述 作用:将一段经常使用的代码封装起来&#xff0c;减少重复代码一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个块实现特定的功能。 2 函数的定义 eg: int max(int a,int b); {retu…

CSS:filter(滤镜)属性

用途 可以用于img标签&#xff0c;div标签等 图像&#xff0c;背景&#xff0c;边框的调整 常用属性 1. 灰度 grayscale()&#xff0c;默认是0&#xff0c;100%就是黑白 2. blux 给图像设置高斯模糊的程度&#xff0c;radius值设定高斯模糊的程序&#xff0c;表示像素点…

Eureka基础介绍和使用

目录 一.理论基础 二.父项目 2.1 新建父项目 2.2 管理依赖 三.子项目 3.1 新建子项目 3.2 注册中心Server依赖和启动类和配置文件 3.3 生产者Client 依赖和启动类和配置文件 3.5 消费者Custmer依赖和配置类、启动类和配置文件 四.心跳 五.公共资源项目 5.1新建实体…