算法-快速排序-Python版详解

原题如下:

给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

1. 整体功能概述

快速排序思想:

代码来源

作者:Philosober
链接:https://www.acwing.com/activity/content/code/content/902188/

def quick_sort(l,r,data):if l >= r:returni = l - 1j = r + 1pivot = data[(i+j) // 2]while i < j:while 1:i += 1if data[i] >= pivot:breakwhile 1:j -= 1if data[j] <= pivot:breakif i < j:data[i],data[j] = data[j],data[i]quick_sort(l,j,data)quick_sort(j+1,r,data)def main():l = 0r = n-1quick_sort(l,r,data)if __name__ == "__main__":n = int(input())data = [int(x) for x in input().split()]main()print(' '.join(list(map(str, data))))

结果输出:

        这段代码实现了快速排序算法,用于对输入的一组整数进行排序,并在排序完成后输出排序后的结果。快速排序是一种高效的排序算法,它基于分治策略,通过选择一个 “枢轴”(pivot)元素,将数组分为两部分,左边部分的元素都小于等于枢轴,右边部分的元素都大于等于枢轴,然后递归地对这两部分进行排序。

2. 函数和模块结构

  • quick_sort函数:这是实现快速排序核心逻辑的函数,它接受三个参数:l(表示要排序的数组片段的左边界索引)、r(表示要排序的数组片段的右边界索引)和data(表示要排序的整数数组)。
  • main函数:主要用于设置排序的初始边界,并调用quick_sort函数进行排序。
  • if __name__ == "__main__"语句块中,获取用户输入的数组长度n和数组元素,然后调用main函数完成排序并输出结果。

3. quick_sort函数详细解释

(1)递归终止条件
if l >= r:return

当要排序的数组片段的左边界索引l大于等于右边界索引r时,说明该片段已经只有一个元素或者为空,此时不需要再进行排序,直接返回即可。

(2)初始化指针和选择枢轴
i = l - 1
j = r + 1
pivot = data[(i + j) // 2]
  • 首先,初始化两个指针iji初始化为左边界索引l减 1,j初始化为右边界索引r加 1。这里的初始化值是为了后续在循环中能正确地向中间移动指针并找到合适的元素与枢轴进行比较。
  • 然后,选择枢轴元素。这里通过data[(i + j) // 2]来选择枢轴,即取当前要排序的数组片段中间位置(这里的中间位置计算方式是先将ij相加再除以 2)的元素作为枢轴。
(3)主循环
while i < j:while 1:i += 1if data[i] >= pivot:breakwhile 1:j -= 1if data[j] <= pivot:breakif i < j:data[i], data[j] = data[j], data[i]
  • 外层while循环的条件是i < j,只要这两个指针还没有相遇,就继续循环进行元素的比较和交换操作。
  • 内层第一个while循环:不断将指针i向右移动(通过i += 1),直到找到一个大于等于枢轴pivot的元素。这里使用while 1:是为了让循环一直执行,直到满足if data[i] >= pivot:这个条件时通过break跳出循环。
  • 内层第二个while循环:与第一个内层循环类似,不断将指针j向左移动(通过j -= 1),直到找到一个小于等于枢轴pivot的元素。
  • 当内层两个循环都找到合适的元素(即i指向大于等于枢轴的元素,j指向小于等于枢轴的元素)后,如果i < j,说明这两个元素的位置不符合快速排序的要求(左边应该是小于等于枢轴的元素,右边应该是大于等于枢轴的元素),此时就交换data[i]data[j]这两个元素的位置,使得数组在ij这两个位置上的元素更符合快速排序的分区要求。
(4)递归调用
quick_sort(l, j, data)
quick_sort(j + 1, r, data)

        在完成一次ij指针的移动和元素交换操作后,数组被以j为界分成了两部分:左边部分(索引从lj)和右边部分(索引从j + 1r)。然后分别对这两部分递归地调用quick_sort函数进行排序,直到整个数组都被排序完成。

4. main函数详细解释

(1)设置初始边界
l = 0
r = n - 1

main函数中,首先设置了要排序的数组的初始左边界l为 0,右边界rn - 1,这里的n是数组的长度,在后续的代码(在if __name__ == "__main__"语句块中)会获取到用户输入的数组长度。

(2)调用快速排序函数
quick_sort(l, r, data)

        接着,调用quick_sort函数对整个数组(从索引 0 到索引n - 1)进行排序,传入的参数是设置好的初始边界lr以及要排序的数组data

5. if __name__ == "__main__"语句块详细解释

(1)获取用户输入
n = int(input())
data = [int(x) for x in input().split()]
  • 首先,通过int(input())获取用户输入的整数,这个整数表示要排序的数组的长度n
  • 然后,通过[int(x) for x in input().split()]获取用户输入的以空格分隔的整数序列,并将其转换为整数列表data,这个列表就是要进行排序的数组。
(2)调用main函数并输出结果
main()
print(' '.join(list(map(str, data))))
  • 首先调用main函数,在main函数中会完成对数组data的排序操作。
  • 最后,通过print(' '.join(list(map(str, data))))将排序后的数组元素以空格分隔的字符串形式输出。这里先使用list(map(str, data))将整数列表中的每个元素转换为字符串,然后使用join方法将这些字符串用空格连接起来,形成一个可以直接输出的字符串形式。

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

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

相关文章

strlwr(arr);的模拟实现(c基础)

hi , I am 36 适合对象c语言初学者 strlwr(arr)&#xff1b;函数是把arr数组变为小写字母,并返回arr 链接介绍一下strlwr(arr)&#xff1b;(c基础)-CSDN博客 下面进行My__strlwr(arr);模拟实现 #include<stdio.h> //返回值为arr(地址),于是用指针变量,原数组为字符型…

Hadoop分布式文件系统(一)——HDFS简介

目录 1. HDFS设计目标2. HDFS组件3. HDFS数据复制4. HDFS健壮性4.1 磁盘数据错误&#xff0c;心跳检测和重新复制4.2 集群均衡4.3 数据完整性4.4 元数据磁盘错误4.5 快照 5. HDFS数据组织5.1 数据块存储5.2 流水线复制5.3 文件的删除和恢复 参考 1. HDFS设计目标 1.错误检测和快…

基于UDP和TCP实现回显服务器

目录 一. UDP 回显服务器 1. UDP Echo Server 2. UDP Echo Client 二. TCP 回显服务器 1. TCP Echo Server 2. TCP Echo Client 回显服务器 (Echo Server) 就是客户端发送什么样的请求, 服务器就返回什么样的响应, 没有任何的计算和处理逻辑. 一. UDP 回显服务器 1. UD…

STM32完全学习——使用标准库完成PWM输出

一、TIM2初始化 我这里使用的是STM32F407ZGT6这个芯片&#xff0c;我这里使用的是定时器TIM2来完成PWM输出&#xff0c;由于这里没有使用中断&#xff0c;因此不需要初始化NVIC&#xff0c;下面先来进行定时器的相关初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;R…

Qt Qt::UniqueConnection 底层调用

在这里插入图片描述 步骤1&#xff1a; 1&#xff1a;判断槽函数连接方式&#xff0c; 以及信号对象是否有效2&#xff1a; 信号计算格式是否 大于 signal_index 目前调试 signal_index 不太清楚怎末计算的&#xff08;有清楚的帮忙街道&#xff09;3&#xff1a;获取槽函数对…

7-10 解一元二次方程

7-10 解一元二次方程 分数 20 全屏浏览 切换布局 作者 李祥 单位 湖北经济学院 请编写程序&#xff0c;解一元一次方程 ax2bxc0 。 已知一元二次方程的求根公式为&#xff1a; 要求&#xff1a; 若 a0&#xff0c;则为一元一次方程。 若 b0&#xff0c;则方程有唯一解&…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(三)

本篇紧跟第一篇&#xff0c; 和 第二篇无关 Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案 Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案(二) 先说需求&#xff1a; 某业务配置表&#xff0c;按配置的时间区间及组织层级取方…

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…

Varjo:垂直起降机混合现实培训解决方案

混合电动垂直起降机&#xff08;VTOL&#xff09;作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落&#xff0c;且排放要远远低于由航空汽油驱动的传统飞…

Android 实现悬浮球的功能

Android 实现悬浮球的功能 在 Android 中&#xff0c;实现悬浮球可以通过以下方式实现&#xff0c;常见的方法是使用 WindowManager 创建一个悬浮窗口。以下是具体的实现步骤&#xff1a; 1. 配置权限 在 AndroidManifest.xml 中添加悬浮窗权限&#xff1a; <uses-permis…

[Python3学习笔记-基础语法] Python3 基础语法

本篇文章详细介绍Python3的基础语法&#xff0c;主要包括编码、标识符、Python保留字、注释、行缩进、多行语句、Number类型、字符串、空行、print打印等。 这些是Python最基础的东西&#xff0c;掌握好了才能更好的学习后续的内容。 有兴趣共同结伴学习Python的朋友&#xff0…

RabbitMQ3:Java客户端快速入门

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

Gradio学习笔记记录

安装指令&#xff1a;pip install gradio方法介绍 Interface》用于构建一些简单的页面&#xff0c;可以直接用这个指令搞定 形式》接收三个参数分别为处理函数、输入、输出三部分&#xff0c;呈现一般左/上为输入&#xff0c;右或下为输出 fn&#xff1a;将用户界面 &#xff0…

✅ Qt流式布局

Qt流式布局 前段时间&#xff0c;曾经对某个软件的一个“流式布局”有点感兴趣&#xff0c;什么叫“流式布局”呢&#xff1f;请看下图: 简而言之&#xff0c;流式布局就是布局应能够根据界面尺寸的变化自动调整其内部控件的位置。然而&#xff0c;Qt 提供的标准布局&#xff…

为什么我们需要DDD?DDD领域驱动设计入门及案例讲解(图文并茂+浅显易懂)

DDD领域驱动设计入门目录 Q1&#xff1a;为什么需要DDD领域驱动设计模型&#xff1f;Q2&#xff1a;DDD领域驱动设计模型怎么用&#xff1f;设计领域模型的一般步骤一、战略建模&#xff08;从高处俯瞰业务 - 微服务的宏观规划&#xff09;1. 领域划分2. 界限上下文定义3. 统一…

vue--制作购物车

&#x1f914;如何制作出下列效果呢&#xff1f;&#x1f447; &#x1f636;‍&#x1f32b;️首先: 设置css样式&#xff1a; <style>body {font-family: Arial, sans-serif;}.cart-item {width: 50%;margin-bottom: 15px;padding: 10px;border: 2px solid gray;borde…

MFC 对话框中显示CScrollView实例

有时候我们需要在对话框中显示CScrollView效果的控件&#xff0c;类似于以下效果&#xff1a; 使用实例可参考&#xff1a;MFC对话框显示CScrollView例子_哔哩哔哩_bilibili 创建CScrollView中显示的子对话框与子类&#xff1a; 两个对话框对应的类&#xff1a; CScrollView继…

高危,Laravel参数注入漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中&#xff0c;Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv]&#xff0c;但没有检查运行环境是否为 CLI…

【unity小技巧】unity常用的编辑器扩展

文章目录 1. **自定义 Inspector&#xff08;Inspector 面板&#xff09;**示例&#xff1a; 2. **Editor Window&#xff08;自定义编辑器窗口&#xff09;**示例&#xff1a; 3. **PropertyDrawer&#xff08;自定义属性绘制&#xff09;**示例&#xff1a; 4. **菜单项&…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…