分治算法——912. 排序数组

在这里插入图片描述

文章目录

    • 🍈1. 题目
    • 🍌2. 算法原理
    • 🍏3. 代码实现

🍈1. 题目

题目链接:912. 排序数组 - 力扣(LeetCode)

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

🍌2. 算法原理

如果不讲武德,直接sort排序,然后返回,这样也是能通过的,但是意义不大

image-20231201225154753

我们当然是选择用分治的思想,自己来实现这个快排。

这里简单讲解一下快排(以升序为例):

给一个数组,选定一个基准元素key,然后根据这个基准元素,将这个数组分为两部分:

  • key左边这个区间的元素全都是小于等于>= key
  • key右边的区间的元素全都是< key

接下来再将从左边的区域选取基准值、右边的区域选取基准值,依此重复这个操作

image-20231201230023386

这就是快排的核心思想。

不过这个的缺陷就是对应有着大量重复元素时,时间复杂度会退化到O(N2)

所以此题采用的是三路划分的思想,来实现快排

建议先看看此篇文章——分治算法——75. 颜色分类,思想一样

我们将数组分为三个区域,即:

  1. 小于key< key
  2. 等于key== key
  3. 大于key> key

和上面这个75.颜色分类题目同理,三个指针:leftrighti,这里分类套路三种情况

  1. nums[i] < keyswap(nums[++left] , nums[i++])
  2. nums[i] == keyi++
  3. nums[i] > keyswap(nums[--right] , nums[i])

为什么三路划分效率会高一点:

如果这个数组里面全都是key的时候,我们经过一次数组划分,中间这些元素全都是等于key的,接下来中间区域的元素不用管,去左右区间,但此时左右区间并不存在,直接退出递归,所以此时的复杂度从O(N2)降到了O(N)

优化——如何选取key值:

如果要将快排的时间复杂度将近为Nlog(N),要采用随机选key(大佬证明过),有兴趣的可以查阅《算法导论》这本书。

GPT回答(稍微看一下):
快速排序的时间复杂度分析涉及到分割的效率和基准值选择对数组分割的影响。
分割的效率:快速排序的性能高度依赖于数组分割的均匀性。理想情况下,每次分割都能将数组几乎均匀地划分成两个子数组。随机选择基准值可以增加分割的随机性,从而在平均情况下更有可能实现近似均匀的数组分割,进而提高算法的效率。
避免最坏情况:最坏情况下的时间复杂度为 O(N2),这种情况通常发生在基准值的选择不当时,例如每次都选择最大或最小的元素作为基准值。随机选择基准值能够降低最坏情况发生的概率,因为在随机选择的情况下,每次都选取最大或最小值的概率较低。
期望的平均情况:随机选择基准值能够增加算法在平均情况下的效率。数学上的期望证明表明,随机选择基准值导致数组被分割成近似相等的两部分的概率较高,因此排序的时间复杂度在平均情况下接近于 O(N*logN)
综上所述,随机选择基准值有助于提高快速排序的效率。它增加了分割的随机性,降低了最坏情况发生的概率,并在平均情况下实现了更好的性能,使得时间复杂度接近于 O(N*logN)。这种随机性导致平均情况下更为均衡的分割,从而提高了整体排序的效率。

🍏3. 代码实现

class Solution {
public:vector<int> sortArray(vector<int>& nums){srand(time(NULL));  //s->start  rand->randomquickSort(nums,0,nums.size()-1);return nums;}void quickSort(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++;}//划分完之后继续划分quickSort(nums,l,left);quickSort(nums,right,r);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[r%(right - left + 1) + left];}};

对排序不是和了解的,可以查看此篇文章:七大排序

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

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

相关文章

经典神经网络——VGGNet模型论文详解及代码复现

论文地址&#xff1a;1409.1556.pdf。 (arxiv.org)&#xff1b;1409.1556.pdf (arxiv.org) 项目地址&#xff1a;Kaggle Code 一、背景 ImageNet Large Scale Visual Recognition Challenge 是李飞飞等人于2010年创办的图像识别挑战赛&#xff0c;自2010起连续举办8年&#xf…

使用 Go 构建高性能的命令行工具

命令行工具&#xff08;CLI&#xff09;在软件开发中扮演着重要的角色&#xff0c;尤其是在自动化工具、开发工具链和服务器管理等领域。Go 语言以其简洁性和高性能而闻名&#xff0c;非常适合用来创建强大且高效的 CLI 工具。本文将详细介绍如何使用 Go 语言来构建 CLI 应用&a…

大三上oracle数据库期末复习

1、创建表空间 2、创建用户 3、用户授权 oracle数据库逻辑存储结构&#xff1a; 1、表空间&#xff08;最大的逻辑存储单元&#xff09; 创建表空间 2、段 3、盘区&#xff08;最小的磁盘空间分配单元&#xff09; 4、数据块&#xff08;最小的数据读写单元&#xff09; 用…

用JavaScript的管道方法简化代码复杂性

用JavaScript的管道方法简化代码复杂性 在现代 web 开发中&#xff0c;维护干净有效的代码是必不可少的。随着项目的增加&#xff0c;我们功能的复杂性也在增加。然而&#xff0c;javaScript为我们提供了一个强大的工具&#xff0c;可以将这些复杂的函数分解为更小的、可管理的…

Mybatis(1)

目录 Mybatis1.快速入门2.Mybatis介绍3.Mybatis工作示意图4.MyBatis 快速入门4.1.1创建monster表4.1.2 创建resources/mybatis-config.xml4.1.3 创建pojo类4.1.4 创建MonsterMapper接口4.1.5 创建MonsterMapper.xml4.1.6 mybatis-config.xml 引入Mapper.xml 文件4.1.6 创建SqIS…

索尼mxf覆盖部分恢复案例(索尼PMW-580)

索尼mxf覆盖部分恢复案例(索尼PMW-580) 索尼的摄像机型号是比较繁多的&#xff0c;高端系列基本上是以mxf文件为主&#xff0c;这一类案例之前处理不少&#xff0c;今天我们看一个索尼pmw-580摄像机删除后又覆盖的恢复案例。 故障存储:64G SD卡/Exfat文件系统 故障现象: 拍…

Tmux奇技淫巧

Tmux奇技淫巧 在日常的开发工作中&#xff0c;终端是我们最常用的工具之一。在终端中我们可以调用各种解释器&#xff0c;来执行命令&#xff0c;完成我们的工作。然而&#xff0c;对于只使用终端的默认功能的开发者来说&#xff0c;他们可能会错过一些强大的工具和技巧&#…

分享72个节日PPT,总有一款适合您

分享72个节日PPT&#xff0c;总有一款适合您 72个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1k8e-tkj3SBcKbaipjQ9Deg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

『吴秋霖赠书活动 | 第五期』《Kubernetes原生微服务开发》

【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布式爬虫平…

速通CSAPP(一)计算机系统漫游入门

CSAPP学习 前言 一门经典的计组课程&#xff0c;我却到了大四才学。 anyway&#xff0c;何时都不会晚。 博主参考的教程&#xff1a;本电子书信息 - 深入理解计算机系统&#xff08;CSAPP&#xff09; (gitbook.io)&#xff0c;非常感谢作者的整理。 诚然去看英文版可以学…

51单片机的智能加湿器控制系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DHT11湿度传感器模块继电器等模块构成。主要适用于智能自动加湿器、湿度保持、湿度控制等相似项目。 可实现基本功能: 1、LCD1602液晶屏实时显示湿度信息 2、DHT11采集湿度 3、按键可以调节适宜人体湿度的阈值范围&#xff0…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…