Python 算法高级篇:快速排序的优化算法

Python 算法高级篇:快速排序的优化算法

  • 引言
  • 1. 快速排序的基本原理
  • 2. 快速排序的优化技巧
    • 2.1 随机选择基准
    • 2.2 三分法
    • 2.3 小数组使用插入排序
  • 3. 性能比较
  • 4. 结论

引言

在计算机科学中,排序是一个基本操作,而快速排序( Quick Sort )是最著名和广泛使用的排序算法之一。它是一种高效的、分治的排序算法,通过不断将问题分解成更小的子问题来实现排序。本文将介绍快速排序的基本原理,然后深入讨论一些优化技巧,以提高其性能。

😃😄 ❤️ ❤️ ❤️

1. 快速排序的基本原理

快速排序的基本思想是选择一个元素作为“基准”( pivot ),将小于基准的元素移到基准的左边,将大于基准的元素移到基准的右边,然后递归地对左右两个子数组进行排序。

下面是一个简单的快速排序算法的 Python 实现:

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x <= pivot]right = [x for x in arr[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)

这个算法递归地将数组分为左右两部分,然后在左右子数组上继续排序。在最坏情况下,时间复杂度为 O ( n ^ 2 ),但在平均情况下,快速排序的时间复杂度为 O ( n log n ),这使它成为一种非常高效的排序算法。

2. 快速排序的优化技巧

尽管快速排序是一个高效的排序算法,但在某些情况下,它可能不够快。为了进一步提高性能,可以使用一些优化技巧。

2.1 随机选择基准

快速排序的性能高度依赖于选择的基准元素。如果每次都选择数组的最大或最小元素作为基准,会导致算法在某些情况下性能下降到 O ( n ^ 2 )。为了避免这种情况,可以随机选择基准元素,或者从数组中选择中位数作为基准。

以下是一个随机选择基准的优化:

import randomdef quick_sort(arr):if len(arr) <= 1:return arrpivot = random.choice(arr)left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)

2.2 三分法

传统的快速排序将数组分为两部分:小于基准和大于基准。但在实际应用中,有时会有大量等于基准的元素,这使得快速排序性能下降。一种改进是使用“三分法”:将数组分为小于、等于和大于基准的三部分,然后递归排序小于和大于部分。

以下是使用三分法的优化:

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]less = [x for x in arr if x < pivot]equal = [x for x in arr if x == pivot]greater = [x for x in arr if x > pivot]return quick_sort(less) + equal + quick_sort(greater)

2.3 小数组使用插入排序

对于小数组,插入排序通常比快速排序更快,因为它的常数因子更小。因此,在递归的过程中,当子数组变得足够小的时候,可以切换到插入排序。

以下是一个结合插入排序的优化:

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keydef quick_sort(arr, threshold=10):if len(arr) <= 1:return arrif len(arr) <= threshold:insertion_sort(arr)return arrpivot = arr[0]less = [x for x in arr if x < pivot]equal = [x for x in arr if x == pivot]greater = [x for x in arr if x > pivot]return quick_sort(less) + equal + quick_sort(greater)

3. 性能比较

为了演示这些优化技巧的性能,我们将使用不同大小的随机数组来对比未优化和优化后的快速排序。

import random
import timeitarr = [random.randint(1, 1000) for _ in range(1000)]# 未优化的快速排序
def quick_sort_original(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x <= pivot]right = [x for x in arr[1:] if x > pivot]return quick_sort_original(left) + [pivot] + quick_sort_original(right)# 测试未优化的快速排序
time_original = timeit.timeit(lambda: quick_sort_original(arr), number=100)# 优化后的快速排序
def quick_sort_optimized(arr):if len(arr) <= 1:return arrpivot = random.choice(arr)left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort_optimized(left) + middle + quick_sort_optimized(right)# 测试优化后的快速排序
time_optimized = timeit.timeit(lambda: quick_sort_optimized(arr), number=100)print(f"未优化的快速排序平均耗时: {time_original:.6f} 秒")
print(f"优化后的快速排序平均耗时: {time_optimized:.6f} 秒")

这个示例生成一个包含 1000 个随机整数的数组,并分别测试未优化和优化后的快速排序的性能。优化后的版本通常会更快。

4. 结论

快速排序是一种高效的排序算法,但通过应用一些优化技巧,可以进一步提高其性能。随机选择基准、三分法和结合插入排序都是有效的优化方法。在实际应用中,选择合适的优化策略取决于数据的特性和规模。

希望本文对快速排序及其优化算法有所帮助,使你能够更好地理解和应用这一经典的排序算法。在实际编程中,记得根据具体情况选择合适的优化策略,以获得最佳性能。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

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

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

相关文章

接口自动化测试工具,Postman使用详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已经停止维护&#xff0c;官方也不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman…

你绝对不知道的接口加密解决方案:Python的各种加密实现

在现代软件开发中&#xff0c;接口测试已经成为了不可或缺的一部分。随着互联网的普及&#xff0c;越来越多的应用程序都采用了接口作为数据传输的方式。接口测试的目的是确保接口的正确性、稳定性和安全性&#xff0c;从而保障系统的正常运行。 在接口测试中&#xff0c;加密…

吃豆人C语言开发—Day2 需求分析 流程图 原型图

目录 需求分析 流程图 原型图 主菜单&#xff1a; 设置界面&#xff1a; 地图选择&#xff1a; 游戏界面&#xff1a; 收集完成提示&#xff1a; 游戏胜利界面&#xff1a; 游戏失败界面 死亡提示&#xff1a; 这个项目是我和朋友们一起开发的&#xff0c;在此声明一下…

金融行业网络安全保护与三级等保合规实施方案

金融行业网络安全保护与三级等保合规实施方案旨在帮助金融机构实施符合三级等保标准的网络安全保护措施。以下是一个基本的实施方案概述&#xff1a; 评估和规划&#xff1a; 进行风险评估&#xff1a;评估网络系统的风险&#xff0c;确定安全威胁、弱点和潜在风险。 确定等级…

Kafka入门04——原理分析

目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…

基于安卓android微信小程序的校园跑腿系统

项目介绍 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园跑腿系统被用户普遍使用&#xff0c;为方便用户能…

Kubernetes(K8S)集群部署

目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节…

腾讯云 AI 绘画:文生图、图生图、图审图 快速入门

腾讯云 AI 绘画是腾讯云推出的一款基于人工智能的图像生成和编辑产品&#xff0c;能够根据输入的图片或描述文本&#xff0c;智能生成与输入内容相关的图片&#xff0c;支持多样化的图片风格选择。 在本文中&#xff0c;我们将介绍如何使用腾讯云 AI 绘画的三项主要功能&#…

如何使用 VuePress 搭建博客网站并 Vercel 部署

先来看一下网站截图&#xff1a; 快速上手 1.创建并进入一个新目录 mkdir vuepress-starter && cd vuepress-starter2.使用你喜欢的包管理器进行初始化 yarn init # npm init3.将 VuePress 安装为本地依赖 yarn add -D vuepress # npm install -D vuepress4.创建你…

Qt中的单例模式

QT单例类管理信号和槽函数 Chapter1 Qt中的单例模式一、什么是单例模式&#xff1f;二、Qt中单例模式的实现2.1、静态成员变量2.2、静态局部变量2.3、Q_GLOBAL_STATIC 宏实例2 三、使用场景四、注意事项 Chapter2 QT单例类管理信号和槽函数一、创建单例类二、主界面添加组件三、…

Redis3.2.12版本服务器迁移

1.新机器更新yum源 yum -y update 2.新机器安装redis数据库 yum install redis 3.新机器下载fedora的epel仓库 systemctl enable redis 4.将旧机器上的/etc/redis.conf拷贝到新机器的/config目录下 scp -r -P22 redis.config root162.32.196.57:/config/redis.config 5.新机器启…

为虚拟网络提供敏捷负载均衡:Everoute LB 特性解读

为了保证应用系统的可用性&#xff0c;同时避免并发访问导致后端服务器出现性能瓶颈&#xff0c;不少用户都通过负载均衡技术优化流量分发。随着虚拟化平台下用户业务规模的持续扩大&#xff0c;虚拟化网络的数据访问量也不断增加&#xff0c;而传统负载均衡通常通过硬件负载均…

PyTorch基础(18)-- torch.stack()方法

一、方法详解 首先&#xff0c;看一下stack的直观解释&#xff0c;动词可以简单理解为&#xff1a;把……放成一堆、把……放成一摞。 有了对stack方法的直观感受&#xff0c;接下来&#xff0c;我们正式解析torch.stack方法。 PyTorch torch.stack() method joins (concaten…

统计学习方法 支持向量机(下)

文章目录 统计学习方法 支持向量机&#xff08;下&#xff09;非线性支持向量机与和核函数核技巧正定核常用核函数非线性 SVM 序列最小最优化算法两个变量二次规划的求解方法变量的选择方法SMO 算法 统计学习方法 支持向量机&#xff08;下&#xff09; 学习李航的《统计学习方…

数据结构—线性表(下)

文章目录 6.线性表(下)(4).栈与队列的定义和ADT#1.ADT#2.栈的基本实现#3.队列的形式#4.队列的几种实现 (5).栈与队列的应用#1.栈的应用i.后缀表达式求值ii.中缀表达式转后缀表达式 #2.队列的应用 (6).线性表的其他存储方式#1.索引存储#2.哈希存储i.什么是哈希存储ii.碰撞了怎么…

【高阶数据结构】B树

目录 1.B树 2.B树和B树的不同 3.B*树 B树较于哈希红黑树的优势&#xff1a;外查找&#xff1a;读取磁盘数据 &#xff1b; B树的高度更低&#xff0c;对磁盘的进行I/O操作的次数更少&#xff08;磁盘的性能比内存差得多&#xff09;&#xff1b; 1.B树 1.1.B树的概念&am…

如何在Puppeteer中设置User-Agent来绕过京东的反爬虫机制?

概述 京东作为中国最大的电商平台&#xff0c;为了保护其网站数据的安全性&#xff0c;采取了一系列的反爬虫机制。然而&#xff0c;作为开发者&#xff0c;我们可能需要使用爬虫工具来获取京东的数据。 正文 Puppeteer 是一个由 Google 开发的 Node.js 库&#xff0c;它提供…

2023年集成电路还缺人吗?集成电路产业人才供需研讨会

10月20日&#xff0c;移知教育创始人团长受邀参与由ARM举办的《集成电路产业人才供需研讨会》&#xff0c;同样受邀参与的还有上海大学、华东理工大学、华东师范大学、上海工程技术大学、上海人社高级职称评审专家等等&#xff0c;高校负责人以及行业专家应邀参加了本次研讨会。…

数学与经济管理

数学与经济管理&#xff08;2-4分&#xff09; 章节概述 最小生成树问题 答案&#xff1a;23 讲解地址&#xff1a;74-最小生成树问题_哔哩哔哩_bilibili 最短路径问题 答案&#xff1a;81 讲解地址&#xff1a;75-最短路径问题_哔哩哔哩_bilibili 网络与最大流量问题 真题 讲解…

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net乡村旅游管理系统 二、…