当前位置: 首页 > news >正文

【AcWing-Python-785】快速排序

题目:https://www.acwing.com/problem/content/description/787/
对应视频讲解:https://www.acwing.com/video/227/

题目描述

注意本题数据已加强。

快速排序过程中,如果每次取区间起点或者终点作为分界点,则会超时。

分界点换成随机值,或者区间中点即可。


解题思路及代码

(一)解题思路及举例

分治策略:将规模为n的原问题分解为规模减半的子问题,分别求解每个子问题,然后把子问题的解进行综合,从而得到原问题的解

举例如下:

给定一个数组,如 [3, 1, 2, 3, 5]

给定两个指针,分别指向数组的最左侧和最右侧的外侧,再将两指针分别往中间移动一位,此时指针i指向3,指针j指向5,即:

  [3, 1, 2, 3, 5]i                j[3, 1, 2, 3, 5]i            j

假设把最左侧的数作为枢轴值/基准值,即x=3【但由于本题数据已增强,在代码里,只能取区间中点或随机值作为分界点,若取区间起点/终点,会超时

枢轴值/基准值:用来将整个序列分为两个部分,再分别进行快速排序

确定枢轴值后,从左往右移动i,若i指向的数小于x,则一直移动,直到遇到≥x的数停止。很显然,上来的3就>=x,i停在3的位置

同理,从右往左移动j,若j指向的数大于x,则一直移动,直到遇到≤x的数停止。很显然,5>2,j左移;移到3时停止。如下:

[3, 1, 2, 3, 5]i         j

交换i和j指向的两个数,数组变为 [3, 1, 2, 3, 5],由于交换的是3和3,数组不变。两个指针分别往中间移动一位,如下:

[3, 1, 2, 3, 5]i   j

i指向1<3,右移,2<3,右移,遇到3时停止;j指向2,不满足>3,停止在2的位置,如下:

[3, 1, 2, 3, 5]j  i   

由于此时两指针已经彼此穿过,故不能交换两个数

再以j指向位置作为分界,对其左右两部分分别进行快速排序:

首先看左侧:[3, 1, 2] 都≤3

  • 枢轴值为区间起点3,指针i指向3,指针j指向2

  • i指向3不是<3的,故i停在该位置

  • j指向2不是>3的,故j停在该位置

  • 交换两数,数组变为 [2, 1, 3],同时两指针均往中间移动一位,都指向1

  • i指向1满足<3,右移一位,指向3;j指向1不满足>3,停止。如下:

[2, 1, 3]j  i   

同理,此时两指针已经彼此穿过,不能交换两个数。再以j为分界,划分为 [2, 1] 和 [3]

  • 对于 [2, 1],枢轴值为区间起点2,i指向2并停止,j指向1并停止,交换两数,变为 [1, 2]。两指针均往中间移动一位,彼此穿过,跳出循环,返回 [1, 2]

  • [3] 只有一个数,不需要排序,直接返回

综上,左半部分最终返回 [1, 2, 3]

再看右侧:[3, 5] 都≥3

  • 枢轴值为区间起点3,指针i指向3,指针j指向5

  • i指向3不满足<3,停止;j指向5,满足>3,左移一位到3,不满足>3,停止

  • 此时两指针都指向3,位于一个位置,跳出循环,返回 [3, 5]

综上,右半部分最终返回 [3, 5]

合并左右两部分结果即得到排好序的序列输出:[1, 2, 3, 3, 5]


(二)代码

n = int(input())
nums = list(map(int, input().split()))   # 通过map实现类型转换,返回listdef QuickSort(arr, left, right):if left >= right:return arr# 1、确定分界点i, j, x = left-1, right+1, arr[(left+right) // 2]   # 左指针 右指针 分界点(中间值,向下取整)while i < j :i+=1j-=1# 左边区间的值放小于x,指针不断右移;右边的相反while arr[i] < x :i += 1while arr[j] > x :j -= 1# 2、调整区间,使得左边区间是<=x的数,右边区间是>=x的数# 移动过后,如果i还是小于j,说明左边或者右边有逆向数据,所以交换if i < j:arr[i], arr[j] = arr[j], arr[i]# 3、递归处理左右两个区间   QuickSort(arr, left, j)QuickSort(arr, j+1, right)QuickSort(nums, 0, n-1)
print(' '.join(map(str, nums)))

知识点总结

(一)map()函数

根据提供的函数对指定的序列做映射,返回一个集合

map(function, iterable)

参数:

  • function:接受一个函数名

  • iterable:接受一个或多个可迭代的序列

把函数依次作用在list中的每一个元素上,得到一个新的list并返回(map不改变原list,而是返回一个新list)

(二).join()函数

是一个字符串操作函数

str.join(item)

参数:

  • str:字符串/字符

  • item:一个成员,注意括号里只能有一个成员

例子:

','.join('abc')
# 将字符串abc中的每个成员以字符,分隔开  再拼接成一个字符串

相关文章:

【AcWing-Python-785】快速排序

题目&#xff1a;https://www.acwing.com/problem/content/description/787/对应视频讲解&#xff1a;https://www.acwing.com/video/227/题目描述注意本题数据已加强。快速排序过程中&#xff0c;如果每次取区间起点或者终点作为分界点&#xff0c;则会超时。分界点换成随机值…...

从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化

经历了数千次改进&#xff0c;Java 的垃圾回收在吞吐量、延迟和内存大小方面有了巨大的进步。 2014 年3 月 JDK 8 发布&#xff0c;自那以来 JDK 又连续发布了许多版本&#xff0c;直到今日的 JDK 18 是 Java 的第十个版本。借此机会&#xff0c;我们来回顾一下 HotSpot JVM 的…...

虚拟机VMware Workstation Pro环境搭建

VMware Workstation Pro是一款虚拟化工具&#xff0c;允许用户在Windows PC上运行多个操作系统。这个平台提供一个安全和独立的环境&#xff0c;让用户在使用前&#xff0c;可以建立和测试应用程序、检查修补程序&#xff0c;以及尝试不同的操作系统。它附有虚拟机库 它允许用户…...

【华为OD机试模拟题】用 C++ 实现 - 敏感字段加密(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

关于Java方法重写的一些反思

最近在开发中遇到一个关于Java方法重写的一些问题&#xff0c;对于方法重写的用法以及可能导致的问题产生了一些思考&#xff0c;本文用于记录下这些想法。 问题场景 我们首先来看两段代码&#xff1a; Override protected void onActivityResult(int requestCode, int resu…...

【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.文件操作1.1 概述…...

图形编辑器:拖拽阻塞优化

大家好&#xff0c;我是前端西瓜哥。在图形编辑器中&#xff0c;想象这么一个场景&#xff0c;我们撤销了一些重要的操作&#xff0c;然后想选中一个图形&#xff0c;看看它的属性。你点了上去&#xff0c;然后你发现你再也无法重做了。 你以为你点了一下&#xff0c;但其实你…...

c++ 的 Eigen库写 AX=XB的矩阵求解代码

1.AXXB的矩阵求解代码(3*3) #include <iostream> #include <Eigen/Dense>int main() {// 定义矩阵A和BEigen::MatrixXd A(3, 3);A << 1, 2, 3,4, 5, 6,7, 8, 9;Eigen::MatrixXd B(3, 3);B << 10, 11, 12,13, 14, 15,16, 17, 18;// 求解AXXBEigen::Mat…...

正点原子linux驱动篇

linux驱动开发与裸机开发的区别 裸机直接操作寄存器&#xff0c;有些mcu提供了库&#xff0c;但还是很底层 1、linux驱动开发直接操作寄存器很麻烦不现实&#xff0c;主要是根据linux驱动框架进行开发&#xff08;就是有很多操作都是一样的&#xff0c;我们只需要对一个程序模…...

MATLAB绘制雷达图/蜘蛛图

雷达图/蜘蛛图 1 方法一 函数来源为MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图) 1.1 调用函数 1.2 案例 2 方法二 函数来源为MATLAB帮助-spider_plot 2.1 调用函数 语法&#xff08;Syntax&#xff09;&#xff1a; spider_plot(P)spider_plot(P, Name, Value, ...)h …...

算法入门,十字路口选择的案例,如果是南方,则向前行

从if判断start; 十字路口的案例 class HelloWorld { static void Main(string[] args) { /* Write C# code in this online editor and run it. */ Console.WriteLine("Hello World!"); string f…...

父传子与子传父步骤

父传子&#xff1a; 问题&#xff1a;父页面中引入子组件 把想要传给子页面的值用在子组件中用 &#xff1a;值“值” (用同一个值好区分)来绑定。 在子页面中用props接收 子组件不能改变父组件传过来的值。&#xff08;传多个页面的时候是&#xff0c;比如父传孙的时候我会…...

Java concurrency - Task Execution

1.在单个线程里处理所有的请求&#xff1a;接受请求-处理请求 优点&#xff1a;逻辑简单 缺点&#xff1a;吞吐量低&#xff0c;资源利用率低&#xff0c;响应时间长 2.每个任务分配一个单独的线程来处理&#xff1a; 接受请求-创建线程-在线程里处理请求 优点&#xff1a; …...

浅谈BOM

什么是BOM BOM对于每个前端都不陌生&#xff0c;但是很多人都停留在表面&#xff0c;而没有深层次的研究过它。JavaScript有一个非常重要的运行环境就是浏览器&#xff0c;而且浏览器本身又作为一个应用程序需要对其本身进行操作&#xff0c;所以通常浏览器会有对应的对象模型…...

每日学术速递2.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.BUAA_BIGSCity: Spatial-Temporal Graph Neural Network for Wind Power Forecasting in Baidu KDD CUP 2022 标题&#xff1a;BUAA_BIGSCity&#xff1a;百度KDD CUP 2022风电预测…...

SpringBoot 面试问答总结(VIP典藏版)

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用Spring 的难度&#xff0c; 简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什…...

CSS 定位网页元素【快速掌握知识点】

目录 前言 一、position: static 二、position: relative 三、position: absolute 四、position: fixed 五、position: sticky 前言 当我们在设计网页时&#xff0c;经常需要对网页中的元素进行定位&#xff0c;以便它们出现在我们想要的位置。在 CSS 中&#xff0c;我们…...

构建Docker基础镜像(ubuntu20.04+python3.7.1+chrome101+chromedriver101)

文章目录 一、前置条件1.下载 chrome【google-chrome-stable_current_amd64.deb】2.下载 chromedriver【chromedriver_linux64.zip】3.创建 ubuntu 镜像源文件【sources.list】二、构建方法1.构建目录1.创建DockerFile2.打包镜像一、前置条件 要先下载一个支持 linux 的 浏览器…...

最新最全Java面试知识

工作也有好些年了&#xff0c;从刚毕业到前几年看过无数的面试题&#xff0c;在这个过程中也作为面试官面试过其他人&#xff0c;总想着自己写一个面试总结&#xff0c;随着自我认识的变化&#xff0c;一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也…...

个人电脑需求严重疲软,联想集团财务前景仍不乐观

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 财务业绩 联想集团&#xff08;00992&#xff09;于2月16日盘后公布了2023财年第三季度财报。 财报显示联想集团2023年第三季度的收入为152.67亿美元&#xff0c;从2022年第三季度的2011.27亿美元下降了24.1%。这也导致该公…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...