Python排序算法大比拼:快速排序 VS 归并排序

更多资料获取

📚 个人网站:ipengtao.com


快速排序和归并排序是两种常见的排序算法,在Python中有着重要的应用。本文将深入探讨这两种算法的原理和实现,并提供丰富的示例代码来说明它们的工作方式。

快速排序算法

def quicksort(arr):if len(arr) <= 1:return arrelse:pivot = arr[0]less = [x for x in arr[1:] if x <= pivot]greater = [x for x in arr[1:] if x > pivot]return quicksort(less) + [pivot] + quicksort(greater)arr = [3, 6, 8, 10, 1, 2, 1]
print("快速排序结果:", quicksort(arr))

快速排序是一种分治算法,通过选择一个基准值(pivot),将数组分为比基准值小和比基准值大的两部分,然后递归地对这两部分进行排序。

归并排序算法

def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half):if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [3, 6, 8, 10, 1, 2, 1]
merge_sort(arr)
print("归并排序结果:", arr)

归并排序算法则是将数组不断二分直至单个元素,再进行合并排序,最终得到有序数组。

对比与性能分析

快速排序

快速排序是一种高效的排序算法,通常情况下具有较快的速度。它通过不断选取基准值,将数据分成两个子数组,然后对子数组进行递归排序。然而,当选择的基准值不平衡时,快速排序可能会在最坏情况下退化为O(n^2)的时间复杂度。这种情况通常发生在数组已经有序的情况下。

归并排序

归并排序是一种稳定、时间复杂度为O(nlogn)的排序算法。它通过将数组分割成较小的子数组,然后将这些子数组合并成有序序列。尽管归并排序时间复杂度稳定且较为稳定,但它需要额外的空间来存储子数组,在某些内存受限的情况下可能不够适用。

性能对比

快速排序和归并排序各有优劣。快速排序通常在实践中表现更快,但在特定情况下可能出现性能问题。归并排序则提供了稳定的O(nlogn)时间复杂度,但牺牲了额外的内存空间。在选择排序算法时,需要考虑数据规模、数据的初始状态以及对稳定性和内存的需求。

适用场景

快速排序适用场景

快速排序在处理大型数据集时表现出色,其平均时间复杂度为O(nlogn),对于大规模数据的排序具有较高的效率。它的分治思想和原地排序特性使得其在实践中通常比较快速。

归并排序适用场景

归并排序适合对稳定性要求较高的情况,因为它能保持相同元素在排序前后的相对位置不变。此外,虽然归并排序的时间复杂度稳定在O(nlogn),但需要额外的内存空间来存储临时数据,这使得它更适用于对内存占用有限制的场景。

在实际应用中,需要根据具体需求选择合适的排序算法。如果对排序稳定性和内存占用有较高要求,归并排序是一个合适的选择;而如果需要快速排序大规模数据集,快速排序则可能更合适。

总结

在本文中,分享了Python中的快速排序和归并排序算法。快速排序利用分治思想,通过选取基准值,将数组分为小于和大于基准值的两部分,然后递归地对这两部分进行排序,最终合并得到有序数组。而归并排序则是不断地将数组分为更小的部分直至单个元素,再将这些部分有序地合并,达到排序的目的。通过示例代码,能够清晰地了解这两种排序算法的实现原理及运行方式。

对比分析显示,快速排序在大型数据集上表现优异,但在最坏情况下可能会出现性能退化;而归并排序的时间复杂度稳定为O(nlogn),但需要额外的空间。了解它们的优劣势以及适用场景对于正确选择合适的排序算法至关重要。快速排序适用于大型数据集,而归并排序则适用于稳定性要求高、对内存占用有要求的场景。细的示例代码和对两种算法的分析,读者可以更全面地理解和应用这两种重要的排序算法,帮助他们在实际的编程和数据处理中做出更明智的选择。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

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

相关文章

NSSCTF第13页(3)

[FSCTF 2023]巴巴托斯&#xff01; 看见个输入路径&#xff0c;打了半天没进去&#xff0c;php伪协议也打不进去&#xff0c; 用dirsearch扫一下 看了半天才看出来&#xff0c;那串英文 Access Denied! I love FSCTF Browser 是要用FSCTF浏览器&#xff0c;改一下ua头就行了…

数字图像处理(实践篇)十二 基于小波变换的图像降噪

目录 一 基于小波变换的图像降噪 &#xff08;1&#xff09;小波变换基本理论 &#xff08;2&#xff09;小波分析在图像处理中的应用 &#xff08;3&#xff09;小波变换原理 &#xff08;4&#xff09;小波降噪原理 &#xff08;5&#xff09;小波降噪算法的实现 &…

vsVode C++开发远程虚拟机工程配置

在使用VS Code进行C/C的开发过程中&#xff0c;有三个至关重要的配置文件&#xff0c;分别是 tasks.json, launch.json 和 c_cpp_properties.json 1. tasks.json tasks.json 是在 vscode 中辅助程序编译的模块&#xff0c;可以代你执行类似于在命令行输入 “gcc hello.c -o h…

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确

本文绝对是全网解决这个问题唯一正确的文章&#xff0c;没有之一&#xff01; 很多人都说开启nginx gzip压缩&#xff0c;这些人完全是胡说八道&#xff01;你们到底懂不懂叫gzip压缩啊&#xff1f;&#xff01; 不信你就试试&#xff0c;如果css/js只有gz文件&#xff0c;ng…

排序分析(Ordination analysis)及R实现

在生态学、统计学和生物学等领域&#xff0c;排序分析是一种用于探索和展示数据结构的多元统计技术。这种分析方法通过将多维数据集中的样本或变量映射到低维空间&#xff0c;以便更容易理解和可视化数据之间的关系。排序分析常用于研究物种组成、生态系统结构等生态学和生物学…

中伟视界:AI盒子中的报警预录像功能能解决什么问题?实现原理是怎样的?

现代社会智能安防已成为各行各业的重要一环&#xff0c;而AI盒子中的报警预录像功能更是智能安防的一大利器。这一功能能够解决很多安防方面的难题&#xff0c;其实现原理更是技术创新的体现。 首先&#xff0c;让我们来看看AI盒子中的报警预录像功能能解决哪些问题。在传统的安…

Prosys OPC Client连接OPC DA

Prosys OPC Client连接OPC DA Prosys OPC 客户端将帮助排除 OPC 连接故障并测试 OPC 服务器。 您可以读写数据、浏览服务器以及导出和导入地址空间。 OPC 客户端轻巧、快速且易于使用。 支持 OPC DA 1.0a 和 OPC DA 2.05a 官方地址: https://www.prosysopc.com/products/opc-…

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过&#xff0c;元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的&#xff1f;在本期的《开箱元宇宙》 系列中&#xff0c;我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列&#xff0c;以及是什么原…

4.7-容器网络之host和none

这一节我们来看一下docker中的另外两种网络&#xff0c;host和none。 docker network inspect none 于是就看到Containers, 里面包含了一个test1 表示这个容器连接到了none。

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行&#xff0c;了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…

清理docker Build Cache缓存文件

使用docker构建镜像&#xff0c;发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源&#xff1a; docker system df 可以看到已经占用了26.7GB&#xff0c;清理这个缓存 docker builder prune 再次查看&#xff0c;已经没有缓存了&#xff0c;清理成功。 …

Linux基础操作二:Linux系统介绍

1、系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 1.1、内核引导 当计算机打开电源后&#xff0c;首先是BIOS开机自检&#xff0c;按照BIOS中…

固态继电器的分类:揭秘热门趋势

固态继电器(SSR)已成为现代电子和自动化系统不可或缺的一部分&#xff0c;与传统电磁继电器相比具有众多优势。随着技术的进步&#xff0c;SSR的分类不断发展&#xff0c;催生了令人兴奋的趋势和创新。在本文中&#xff0c;我们将探讨SSR分类的最新趋势&#xff0c;阐明该领域的…

10.索引

一.索引简介 索引用于快速找出在某个列中有一特定值的行。 不使用索引&#xff0c;MySQL必须从第1条记录开始读完整个表&#xff0c;直到找出相关的行。表越大&#xff0c;查询数据所花费的时间越多。 如果表中查询的列有一个索引&#xff0c;MySQL能快速到达某个位置去搜寻…

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

css 字体倾斜

css 字体倾斜 //左右倾斜 transform: skew(40deg, 0deg);//上下倾斜 transform: skew(0deg, 16deg);

【代码】考虑区域多能源系统集群协同优化的联合需求侧响应模型(完美复现)

程序名称&#xff1a;考虑区域多能源系统集群协同优化的联合需求侧响应模型 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;风电、光伏发电等波动电源接入比例不断提高&#xff0c;使得区域多能源系统中能量转化和协调能力减弱。基于此&#xff0c;该…

面试:SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径&#xff0c;ResponsBody注解的用途SpringMVC启动流程SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序&#xff1f;Spring和SpringMVC为什么需要父子容器&#xff1f; SpringMVC运行流程 • 客户端&#…

Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

海外热门:香港服务器和美国服务器的成本较量

​  提到 2023 年海外热门服务器&#xff0c;在整个 IDC 站长圈中&#xff0c;要数香港服务器和美国服务器的关注度一直居高不下。其实也正常&#xff0c;毕竟这两种海外服务器相较成熟。不过&#xff0c;在实际使用中&#xff0c;两者也会被拿来对比&#xff0c;最显而易见的…