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

一、快速排序思路

快速排序特点:

步骤:

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

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

def partition(data,left,right):passdef 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时,循环结束,找到midwhile 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时,循环结束,找到midwhile 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 += 1li[right] = li[left]# print(li, "left")li[left] = tmp  # 把tmp归位return leftdef 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://xiahunao.cn/news/2804196.html

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

相关文章

java 面向对象-上:类的结构之二

类的设计中&#xff0c;两个重要结构之二&#xff1a;方法 方法 描述类应该具的功能。 比如&#xff1a;Math类&#xff1a;sqrt()\random() \... Scanner类&#xff1a;nextXxx() ... Arrays类&#xff1a;sort() \ binarySearch() \ toString() \ equals() \ ... 1.举例 p…

H.323

1 H.323 信令标准。 是 ITU-T 于 1996 年制定的为在局域网上传送话音信息的建议书。 1998 年的第二个版本改用的名称是“基于分组的多媒体通信系统”。 H.323 是互联网的端系统之间进行实时声音和视频会议的标准。 H.323 不是一个单独的协议&#xff0c;而是一组协议。包括…

TYPE-C接口桌面显示器:视频与充电的双重革新

在现代科技的浪潮中&#xff0c;TYPE-C接口桌面显示器崭露头角&#xff0c;它不仅仅是一台显示器&#xff0c;更是充电与视频传输的完美融合。这种新型的显示器&#xff0c;凭借其TYPE-C接口&#xff0c;实现了从DC电源到PD协议充电的华丽转身&#xff0c;为众多设备如笔记本电…

【学网攻】 第(30)节 -- 综合实验三

系列文章目录 目录 系列文章目录 文章目录 前言 一、综合实验 二、实验 1.引入 实验目标 实验设备 实验拓扑图 实验配置 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节…

beego代理前端web的bug

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、beego代理前端web的bug总结 一、beego代理前端web的bug *报错&#xff0c;为web压缩包index.html里面的注释被错误解析&#xff0c;删掉就行 2024/02/22 10:2…

如何在Pycharm中导入第三方库(以pyecharts为例子)

打开Pycharm 点击右上角文件->设置->项目->pythonProject&#xff08;Python解释器&#xff09; 点击下图号 下一步&#xff1a;在搜索栏中直接搜索第三方包pyecharts并安装即可 以上便为使用Pycharm安装第三方库的全过程。 温馨小提示&#xff0c;如果大家在Pychar…

报表开发工具DevExpress .NET Reporting v23.2亮点 - 支持智能标签

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v23.2…

数字化转型导师坚鹏:县域数字化转型案例研究

县域数字化转型案例研究 课程背景&#xff1a; 很多县级政府存在以下问题&#xff1a; 不清楚县域数字化转型的发展模式 不清楚县域数字化转型的成功案例 课程特色&#xff1a; 针对性强 实用性强 创新性强 学员收获: 学习县域数字化转型的发展模式。 学习县…

JavaSec 之 XXE 简单了解

文章目录 XMLReaderSAXReaderSAXBuilderDocumentBuilderUnmarshaller**SAXParserFactory**XMLReaderFactoryDigester总结 XMLReader public String XMLReader(RequestBody String content) {try {XMLReader xmlReader XMLReaderFactory.createXMLReader();// 修复&#xff1a…

链表之“无头单向非循环链表”

目录 ​编辑 1.顺序表的问题及思考 2.链表 2.1链表的概念及结构 2.2无头单向非循环链表的实现 1.创建结构体 2.单链表打印 3.动态申请一个节点 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 8.单链表在pos位置之前插入x 9.单链表删除pos位…

C++的stack容器->基本概念、常见接口

#include<iostream> using namespace std; #include <stack> //栈stack容器常用接口 void test01() { //创建栈容器 栈容器必须符合先进后出 stack<int> s; //向栈中添加元素&#xff0c;叫做 压栈 入栈 s.push(10); s.push(20); s…

华清远见作业第四十一天——Qt(第三天)

思维导图&#xff1a; 编程 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如…

Java编程实战:构建医疗信息管理新平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

项目升级神器 Taze,告别查找单个依赖版本的烦恼

Taze 是由Vue 和 Nuxt 核心成员 AntFu 写的开源库。Taze 主要是用在项目重构或者项目升级的时候检查依赖版本。 Taze 如何使用 Taze 无需安装&#xff0c;可以直接执行 npx taze 即可。 默认情况只会检查 package.json 依赖版本。 要忽略范围&#xff0c;请显式设置允许的最大…

Unity中URP实现水效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片&#xff0c;使其倾斜一个角度&#xff0c;来模拟水底和岸边的效果2、随便创建几个物体&#xff0c;作为与水面接触的物体3、再新建一个面片&#xff0c;作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

第N3周:Pytorch文本分类入门

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** import torch import…

C语言——实用调试技巧——第1篇——(第22篇)

坚持就是胜利 文章目录 一、什么是bug?二、调试是什么&#xff1f;有多重要&#xff1f;三、debug 和 release 的介绍&#xff1f;1、2、3、 四、windows环境调试介绍1、调试环境的准备2、学会快捷键F5 或者 Fn F5条件断点 Ctrl F5F9 或者 Fn F9F10 或者 Fn F10F11 或者 F…

RAG中如何解决上下文知识连贯性问题 || 如何更好的切分和组织非结构化的文档数据

当信息蕴含在较长的上下文时&#xff0c;基于片段的搜索召回&#xff0c;一定会丢失数据&#xff0c;导致最终无法正确的回答问题。 实际上复杂的问题&#xff0c;这里只是说问题本身倾向于从全文获取答案&#xff0c;而不仅仅是基于片段。 斯坦福论文提出的核心问题和解决思路…

小程序--本地存储API

1、存储数据 wx.setStorageSync()&#xff1a;无需转换数据类型&#xff0c;存什么类型的就是什么类型的&#xff0c;data中的数据&#xff0c;使用时是this.data.名称。 saveData() {wx.setStorageSync(list, this.data.list)wx.showToast({title: 存储成功,})}, 2、读取数据…

【Mocreak】傻瓜式一键安装部署OFFICE教程

微软 Office 办公软件安装除了官方的安装包外&#xff0c;还可以通过部署工具来安装各种版本的 Office&#xff0c;其中目前比较流行的是 Office Tool Plus 和 Office 2013-2021 C2R Install 这两个软件。 今天再分享一个类似的 Office 部署工具「Mocreak」同样傻瓜式可以一键…