基于Python3的数据结构与算法 - 04 快速排序

news2024/11/20 13:45:20

一、快速排序思路

快速排序特点:

步骤:

  1. 取一个元素p(第一个元素),使元素p归为;
  2. 列表被p分成两部分,左边都比p小,右边都比p大;
  3. 递归完成排序。

因此我们可以得到快速排序的大致框架:

def partition(data,left,right):
    pass

def quick_sort(data,left,right):
    if left < right:  #证明列表中最少有两个元素
        mid = partition(data,left,right)   # 进行归位
        quick_sort(data,left,mid-1)        #递归,对左边的元素进行快排
        quick_sort(data,mid+1,right)       #递归,对右边的元素进行快排

此时我们需要自己写出partition(归位函数),对元素进行归位。

二、归位函数

思路:例如下面这个数组:

具体思路流程:

  1. 我们需要对5进行归位,需要将5取出来,此时左边5的位置有空位,(其中左右两个箭头分别对应left和right) 
  2. 然后从右边的箭头开始,如果遇到比5小的数,将其放到5的位置(将2取出,放到5的位置)
  3. 此时再从左边开始,如果遇到比5大的数,将其放到之前取数的位置(将7取出,放到2的位置)
  4. 依次循环进行操作。直到left和right的箭头重合,此时将5放进去。

接下面我们尝试写出归位函数的代码:

def partition(data,left,right):
    tmp =li[left]   #先将第一个位置的元素取出,存起来
    while left < right:   #终止条件是当left = right时,循环结束,找到mid
        while left < right and li[right] >= tmp: # 从右边找如果比tmp大的数;且如果右边都是比tmp大的数,right会一直向左走,当left = right退出
            right -=1    #右边箭头向左进一步
        li[left] = li[right]  #此时将右边比tmp小的数放到左边
        print(li,"right")
        while left < right and li[left] <= tmp:   #左边的操作与右边的相同  
            left +=1    
        li[right] = li[left]   
        print(li,"left")
    li[left] = tmp   #把tmp归位
    
li = [5,7,4,6,3,1,2,9,8]
print(li)
partition(li,0,len(li)-1)
print(li)

输出结果如下:

最终我们得到归为函数。

三、快速排序

 最终,在得到归位函数之后,我们可以按照第一步的思路,写出快速排序的代码。

具体代码展示如下:

def partition(li, left, right):
    tmp = li[left]  # 先将第一个位置的元素取出,存起来
    while left < right:  # 终止条件是当left = right时,循环结束,找到mid
        while left < right and li[right] >= tmp:  # 从右边找如果比tmp大的数;且如果右边都是比tmp大的数,right会一直向左走,当left = right退出
            right -= 1  # 右边箭头向左进一步
        li[left] = li[right]  # 此时将右边比tmp小的数放到左边
        # print(li, "right")
        while left < right and li[left] <= tmp:  # 左边的操作与右边的相同
            left += 1
        li[right] = li[left]
        # print(li, "left")
    li[left] = tmp  # 把tmp归位
    return left


def quick_sort(data, left, right):
    if left < right:  # 证明列表中最少有两个元素
        mid = partition(data, left, right)
        quick_sort(data, left, mid - 1)
        quick_sort(data, mid + 1, right)


li = [5, 7, 4, 6, 3, 1, 2, 9, 8]
print(li)
quick_sort(li, 0, len(li) - 1)
print(li)

最终输出可得:

四、快速排序性质的分析

1. 时间复杂度

快速排序的效率(快速排序的时间复杂度):O(nlogn)

(每一层的复杂度为n,一共有logn层)

2. 快速排序的问题

  1. 最坏情况 (假如列表为[9,8,7,6,5,4,3,2,1],此时并不是每次分层logn,而是相当于至少一个数,时间复杂度相当于O({_{n}}^{2})),解决思路,考虑倒序这种情况,选择第一个数改为随机选择一个数。
  2. 递归(递归会消耗系统的资源)

即最好情况下时间复杂度接近于O(n),最坏情况时间复杂度接近于O({_{n}}^{2})。

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

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

相关文章

数字化转型导师坚鹏:政府数字化转型案例研究(包括省市政府)

政府数字化转型案例研究&#xff08;包括省市政府&#xff09; 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚标杆省政府数字化转型的成功案例 不清楚直辖市政府数字化转型的成功案例 不清楚地级市政府数字化转型的成功案例 课程特色&#xff1a…

实验室电磁铁工作环境及操作方法

1、工作环境 &#xff08;1&#xff09; 环境温度5℃-30℃ &#xff08;2&#xff09; 相对湿度不大于70% &#xff08;3&#xff09; 无腐蚀性气体以及对绝缘有损害的气体 &#xff08;4&#xff09;无其他电磁干扰设备 2、电磁铁使用操作方法 &#xff08;1&#xff09…

有哪些适合程序员的副业

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

VBA代码实现excel表格输入内容自动调整行高、列宽

打开excel表&#xff0c;如图1 右键点击表标签名&#xff0c;如&#xff1a;“sheet1”&#xff0c;弹出菜单&#xff0c;点击查看代码 代码编辑窗口 点击图中蓝色部分 点击worksheet&#xff0c;创建子程序&#xff0c;Private Sub Worksheet_SelectionChange(ByVal Target…

实习日志30

概要 高拍仪硬件通信原理&#xff0c;WebSocket源码解析&#xff08;JavaScript&#xff09; WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络&#xff0c;因为与CPU相比&#xff0c;它提供了更多的计算能力。在本教程中&#xff0c;我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先&#xff0c;确保您的机器中至少有一个Nvidia GPU&#xff0c;并正确安装了CUDA以及CUDN…

【算法分析与设计】1的个数

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

Windows系统中定时执行python脚本

背景&#xff1a;本地Windows系统指定目录下会有文件的修改新增&#xff0c;这些变化的文件需要定时的被上传到git仓库中&#xff0c;这样不需要每次变更手动上传了。 首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_et…

深度学习环境配置常见指令

首先打开anaconda prompt&#xff0c;激活对应虚拟环境。 导入torch并获取对应版本 import torch torch.__version__导入torchvision并获取对应版本 import torchvision torchvision.__version__ 检查cuda是否可用 torch.cuda.is_available() 获取CUDA设备数 torch.cuda.…

【知识整理】Git Commit Message 规范

一. 概述 前面咱们整理过 Code Review 一文&#xff0c;提到了 Review 的重要性&#xff0c;已经同过gitlab进行CodeReview 的方式&#xff0c;那么本文详细说明一下对CodeReivew非常重要的Git Commit Message 规范。 我们在每次提交代码时&#xff0c;都需要编写 Commit Mes…

Rabbitmq入门与应用(一)-rabbitmq安装(docker版)

Rabbitmq入门与应用-rabbitmq安装(docker版) RabbitMQ简介 什么是RabbitMQ&#xff1f; RabbitMQ is a message broker: it accepts and forwards messages. You can think about it as a post office: when you put the mail that you want posting in a post box, you can …

C++:string类

标准库中的string类 string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型&#xff0c;使用…

《Python 语音转换简易速速上手小册》第9章 特定领域的语音处理(2024 最新版)

文章目录 9.1 语音处理在不同行业的应用9.1.1 基础知识9.1.2 主要案例:智能客服机器人案例介绍案例 Demo案例分析9.1.3 扩展案例 1:医疗语音助手案例介绍案例 Demo案例分析9.1.4 扩展案例 2:语言学习应用案例介绍案例 Demo

【动态规划专栏】背包问题:1049. 最后一块石头的重量 II

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

FPGA领域顶级学术会议

FPGA领域顶级学术会议主要有FPGA,FCCM,FPL和FPT。 1 FPGA 会议全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 网站是:https://dl.acm.org/conference/fpga FPGA常年在美国举办,每年2月,偏FPGA基础研究; 该会议的论文免费下载。这个比…

与Sora同架构的Stable Diffusion 3.0 震撼发布

Stability AI 发布了 Stable Diffusion 3&#xff0c;这款图像生成 AI 模型再次刷新了人们的认知。 这款由 Stability AI 倾力打造的文本变图模型&#xff0c;可是迄今为止最强大的“黑科技”&#xff01;无论你想生成多主题的奇幻场景&#xff0c;还是高精度的风景写真&#…

RocketMQ高可用架构涉及常用功能整理

RocketMQ高可用架构涉及常用功能整理 1. 集群高可用系统架构和相关组件1.1 架构说明1.2 相关概念说明1.3 消息模型1.3.1 点对点模型1.3.2 发布订阅模型1.3.3 消息过滤 2. rocketmq的核心参数3. rocketmq常用命令4. 事务性4.1 数据写入流程4.2 数据读流程4.3 事务消息 5. 疑问和…

基于Spring Boot的安康旅游网站的设计与实现,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760645517548793858

每日五道java面试题之spring篇(二)

目录&#xff1a; 第一题 Spring事务传播机制第二题 Spring事务什么时候会失效?第三题 什么是bean的⾃动装配&#xff0c;有哪些⽅式&#xff1f;第四题 Spring中的Bean创建的⽣命周期有哪些步骤&#xff1f;第五题 Spring中Bean是线程安全的吗&#xff1f; 第一题 Spring事务…

排序算法之——选择排序

选择排序 1.1基本思想1.1.1总体思路1.1.2具体思路 1.2图示详解1.3完整代码1.4动图演示1.5时间复杂度1.6空间复杂度 1.1基本思想 1.1.1总体思路 每一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排…