算法-快速排序-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,一经查实,立即删除!

相关文章

【Apache paimon】-- 7 -- tag 创建与管理

目录 1、前言 2、操作说明 2.1、自动创建与删除 Tag 2.2、手动创建和删除 tag 2.3、回退到指定Tag 2.4、查询 tag 元数据和数据 2.4.1、查询 tag 元数据 2.4.2、查询 tag 数据 2.4.3、情景1:读取指定 tag 的数据 2.4.4、情景2:读取两个 tag 间的增量数据 3、其他配…

C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景

C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景 code review! 参考笔记 C++笔记之unique_ptr转移堆内空间的所有权 文章目录 C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景一.使用 std::unique_ptr 作为函数参数时的主要场景二.一个完整示例一…

找到最大“葫芦”组合

文章目录 问题描述解题思路分析1. 数据预处理2. 特殊情况处理3. 普通情况计算4. 结果输出 Java代码实现复杂度分析与优化 在经典德州扑克中&#xff0c;“葫芦”是一种较强的牌型。它由五张牌组成&#xff0c;其中三张牌面值相同&#xff0c;另外两张牌面值也相同。本文将探讨一…

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…

银行卡OCR识别API接口的作用有哪些?

在当今数字化高速发展的时代&#xff0c;各种创新技术不断涌现&#xff0c;为我们的生活带来了极大的便利。其中&#xff0c;银行卡 OCR 识别 API 接口就是一项非常实用的技术&#xff0c;它提高了业务办理的效率&#xff0c;准确性高&#xff0c;便捷性强&#xff0c;安全性高…

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;按配置的时间区间及组织层级取方…

prompt

1解释概念 中文指令&#xff1a;请借助费曼学习法&#xff0c;以简单的语言解释[特定概念]是什么&#xff0c;并提供一个例子来说明它如何应用。 Prompt:Please use the Feynman Learning Technique to explain [specific concept] insimple language,and provide an example …

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

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

「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理

本篇将深入探讨 Cangjie 编程语言中的变量操作与类型管理&#xff0c;涵盖变量的定义、作用域、类型推断、常量、变量遮蔽、类型转换等方面的知识。通过这些概念的学习&#xff0c;开发者将更好地理解和灵活掌握变量的使用与管理技巧。 关键词 变量定义类型推断常量变量作用域…

Python和R基因组及蛋白质组学和代谢组学

&#x1f335;Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大&#xff0c;且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…

【华为云函数工作流】python的函数中如何获取请求链接中带的参数

背景 通过调用函数的url&#xff0c;将参数传递给函数执行&#xff0c;函数里如何获取这个参数 过程 下一个简单的demo如下 参考这个链接https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0420.html写一个demo&#xff0c;这个是百度视频云获取token的…

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

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

AWTK fscript 中的 大端小端扩展函数

fscript 是 AWTK 内置的脚本引擎&#xff0c;开发者可以在 UI XML 文件中直接嵌入 fscript 脚本&#xff0c;提高开发效率。本文介绍一下 fscript 中的 ** 大端小端扩展函数 ** 1.is_little 判断当前 CPU 是否是小端。 原型 is_little() > bool示例 print(is_little());2…

Mybatis中使用原生sql与参数进行查询

Mybatis中使用原生sql与参数进行查询.md 一、mapper中定义接口二、mapper对应的xml三、使用样例 有时需要使用原生sql和参数进行动态查询&#xff08;比如可能是通过参数或配置的sql或sql片段执行查询&#xff0c;可能需要用到原生sql查询场景&#xff09;&#xff0c;使用方式…

禁止 Kindeditor富文本粘贴图片和html格式

Kindeditor 文本编辑器是可以通过ctrlv粘贴图片的&#xff0c;粘贴完的图片会转成base54格式&#xff0c;发送到后端需要后端将base64图片转成图片存到服务器上&#xff0c;在将图片路径回填回去&#xff0c;比较费事&#xff0c; 可以将 Kindeditor的 pasteType参数设置成1&am…