Python数据结构-----递归实现快速排序

news2024/11/16 3:45:44

目录

前言:

快速排序

1.概念

 2.示例

Python代码实现

递归实现快速排序


前言:

         今天我们就来一起学习快速排序的思想方法,然后通过Python语言来实现快速排序的功能,下面我们就开始今天的学习吧!

快速排序

1.概念

        快速排序其实是冒泡排序的一种改进形式,其排序速度快,时间复杂度小的特点,成为了很多编程语言封装的排序方法

实现逻辑

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

① 从数列中挑出一个元素,称为 “基准”(pivot),
② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③ 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

 图解如下:

快速排序的4种优化_Tyler_Zx的博客-CSDN博客_快排算法优化

 2.示例

这里有一组数字,3,5,7,1,3,6 如下所示,要对这组数字进行排序

 第一步,先选取基准数temp,一般是以第一个数字作为基准数,然后标记i和j的位置,分别为头跟尾。

 第二步,在 i< j 的前提下开始移动j 和 i,原则是先移动j ,再移动i,当 j 遇到比i指向的数字要小的数字就停止移动,然后开始移动 i,当 i 遇到比temp要大的数字就停止移动,此时开始对i和j 指向的数字进行交换,以此类推。

第三步,当i 和 j 移动到相遇的位置的时候,把i和j相遇指向的数字与temp进行交换,这时候会发现,交换后的数字右边都是比这个数字要大的,左边都是比这个数字要小的。

 第四部,进入递归,这时候我们要把上一步i和j交换后指向的数字左边和右边分别进行递归,也就是这两边再次走完前面的全部流程,最后结果就是已经排序好了的数字了。

Python代码实现

递归实现快速排序

#快速排序
import random as r

def quick(left,right,li):
    if left>right:
        return
    temp=li[left]#获取到数组第一个数字
    i=left #标记i 的位置
    j=right #标记 j的位置
    while i!=j:
        while li[j]>=temp and i<j:
            j-=1
        while li[i]<=temp and i<j:
            i+=1
        if i<j:
            li[i],li[j]=li[j],li[i] #数字交换
    li[left],li[i]=li[i],li[left] #当i和j相遇的时候,进行与temp数字交换

    quick(left,i-1,li) #左边进入递归
    quick(i+1,right,li) #右边进入递归
    return

if __name__ == '__main__':
    li=[r.randint(0,20) for _ in range(10)]
    print(li)
    quick(0,len(li)-1,li)
    print(li)
#输出结果:
#[2, 11, 20, 5, 13, 16, 11, 14, 20, 8]
#[2, 5, 8, 11, 11, 13, 14, 16, 20, 20]

 好了,以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸:

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

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

相关文章

银行数字化转型导师坚鹏:金融科技在银行数字化转型中的创新案例

金融科技在银行数字化转型中的创新与应用案例&#xff08;偏重对公业务&#xff09; 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚5G如何赋能银行数字化转型&#xff1f; 不清楚最新金融科技创新与应用案例&#xff1f; 不了…

【部署YUM仓库】

目录 一、YUM概述1.1、YUM&#xff08; Yellow dog Upadater Modified) 二、准备安装源2.1、YUM软件仓库类型2.2、RPM软件包的来源2.3、第三方yum源的网址查看:2.4、构建CentOS 7 软件仓库2.4.1、配置yum源仓库时要先挂载2.4.2、配置yum源仓库2.4.3、配置完后更新缓存 2.5、ftp…

AutoSAR内存映射

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 为了防止不必要的内存缺口&#xff08;RAM 中未使用的空间&#xff09;&#xff0c;不同大小&#xff08;8、16 和 32 位&#xff09;的变量根据其大小映射到特…

论文笔记:基于并行注意力 UNet的裂缝检测方法

0 简介 论文&#xff1a;基于并行注意力 UNet的裂缝检测方法&#xff08;Parallel Attention Based UNet for Crack Detection&#xff09;&#xff1b; 发表&#xff1a;2021年发表在《计算机研究与发展》上。 1 问题分析 问题&#xff1a;裂缝图像中存在噪声、光线、阴影等…

中睿天下亮相2022电力行业信息化年会

4月14日-15日&#xff0c;以“低碳数字新动力&#xff0c;电力转型新发展”为主题的2022电力行业信息化年会在长沙成功召开。中睿天下作为网络安全企业受邀出席参展&#xff0c;展示多样性网络安全产品、电力行业解决方案及相关应用成果。 作为能源电力领域的行业盛会和学术交流…

垃圾回收器(一)

垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将GC分为不同的类型。 GC分…

设计模式简谈

设计模式是我们软件架构开发中不可缺失的一部分&#xff0c;通过学习设计模式&#xff0c;我们可以更好理解的代码的结构和层次。 设计原则 设计原则是早于设计方法出现的&#xff0c;所以的设计原则都要依赖于设计方法。这里主要有八个设计原则。 推荐一个零声学院免费教程&…

阳光万里,祝你上岸——免统考在职研究生

什么是在职研究生 在职研究生&#xff0c;是国家计划内&#xff0c;以在职人员身份&#xff0c;部分时间在职工作&#xff0c;部分时间在校学习的研究生教育的一种类型。在职攻读硕士方式有三种&#xff1a; 1.双证非全日制研究生&#xff1a;为普通高等教育研究生学历&#x…

QGIS--开发OpenSCENARIO动态场景(三)--制作动态场景

一、添加scenario&#xff0c;carla的环境变量 export CARLA_ROOT/path/to/your/carla/installation export SCENARIO_RUNNER_ROOT/path/to/your/scenario/runner/installation export PYTHONPATH$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-<VERSION>.egg ex…

如何利用工时表来帮助项目管理做得更完善?

项目管理是一项复杂的任务&#xff0c;需要协调各种资源以确保项目按时交付。其中一个关键方面是管理各个员工工时。工时表软件是一种可以帮助企业记录各个员工工作时效的工具&#xff0c;而且还可以帮助项目管理者记录和跟踪项目成员的时间。那么如何利用工时表来帮助项目管理…

如何配置静态路由?这个实例详解交换机的静态路由配置

一、什么是静态路由 静态路由是一种路由的方式&#xff0c;它需要通过手动配置。静态路由与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变。一般来说&#xff0c;静态路由是由网络管理员逐项加入路由表&#xff0c;简单来说&#xff0c;就是需要手动添加的。…

相空间相关概念以及轨迹生成

在时间序列分析中&#xff0c;相位轨迹也被广泛应用于提取隐藏在数据中的结构信息。例如&#xff0c;在人类活动识别任务中&#xff0c;通过构建不同活动对应的相位轨迹&#xff0c;可以揭示活动间的相似性和差异性&#xff0c;从而有助于设计有效的分类方法。 相空间&#xff…

Java每日一练(20230420)

目录 1. 罗马数字转整数 &#x1f31f; 2. 电话号码的字母组合 &#x1f31f;&#x1f31f; 3. 排列序列 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

java基础——Map

Map 第一章 Map集合 1.1 概述 Java提供了专门的集合类用来存放键值对关系的对象&#xff0c;即java.util.Map接口。 我们通过查看Map接口描述&#xff0c;发现Map接口下的集合与Collection接口下的集合&#xff0c;它们存储数据的形式不同&#xff0c;如下图。 Collection中…

Java学习之匿名内部类(非常重要)

目录 一、匿名内部类介绍 基本语法 二、举例说明 1.传统方式实现接口 2.使用匿名内部类进行简化 一、匿名内部类介绍 1.匿名内部类也是类 2.匿名内部类也是内部类 3.匿名内部类没有名字&#xff08;名字存在于JVM中&#xff0c;不会显示出来&#xff09; 4.匿名内部类同时…

Pytorch深度学习笔记(八)处理多维度特征的输入

目录 1.概述 2. 处理多维度特征的输入 注&#xff1a;不同的激活函数&#xff08;sigmoid函数&#xff09;&#xff0c; 绘制不同的图表 推荐课程&#xff1a;07.处理多维特征的输入_哔哩哔哩_bilibili 1.概述 一个八维数据集&#xff1a; 数据集&#xff0c;每一行称为一个…

完整搭建 SpringCloud 项目

目录 1、数据库表结构设计 2、项目结构设计搭建 &#xff08;1&#xff09;创建父工程&#xff08;SpringBoot 类型&#xff09; &#xff08;2&#xff09;其他功能模块搭建 &#xff08;3&#xff09;创建 eureka &#xff08;4&#xff09;创建common 模块 &#xff08;5&…

jmeter常用组件1

常用的组件 常用的组件1&#xff0c;配置元件 1.HTTP请求默认值2.HTTP信息头管理器3.HTTP Cookie管理器4.用户自定义变量5.csv数据导入 2&#xff0c;集合点3&#xff0c;后置处理器 1.debug处理器2.json提取器 本文永久更新地址: 1&#xff0c;配置元件 1.HTTP请求默认值 在…

ASP.NET Core MVC 从入门到精通之Razor语法

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

PyQt在界面/子界面中添加横线

问题&#xff1a; 自己写个了处理数据的小程序&#xff0c;想要在不同的部分之间做个区域划分&#xff0c;使用实线或者虚线标记。 找了几个界面方法&#xff1a;1.使用画图QPainter,画所需要的线。 2.添加按钮&#xff0c;将按钮设置成线的形式 这两种方式都不适合我这个界…