快速排序:Python 中的速度之王,揭秘它的递归魔法与性能极限!

简介: 【7月更文挑战第12天】快速排序**是高效排序算法,基于分治策略。它选择基准值,将数组分成小于和大于基准的两部分,递归地对两部分排序。

在众多排序算法中,快速排序以其高效和出色的性能脱颖而出。在 Python 中,快速排序同样展现了其强大的威力。下面通过具体的案例来深入剖析快速排序的原理、递归魔法以及性能表现。

首先,让我们来了解快速排序的基本原理。快速排序采用了分治的策略,通过选择一个基准元素,将待排序的数组分为小于基准和大于基准的两个子数组,然后对这两个子数组分别进行快速排序,从而实现整个数组的排序。

以下是快速排序的 Python 代码实现:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    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)

为了更好地理解快速排序的工作过程,我们来看一个具体的案例。假设有一个未排序的数组 [12, 11, 13, 5, 6]

首先选择中间元素 13 作为基准。将数组分为小于 13[12, 11, 5, 6] 和大于 13 的空数组。

然后对小于基准的子数组 [12, 11, 5, 6] 再次进行快速排序,选择 6 作为基准,分为 [5][12, 11]

继续对更小的子数组进行排序,直到子数组的长度为 1 或 0 。

通过不断的递归调用和分区操作,最终数组被排序为 [5, 6, 11, 12, 13]

为了测试快速排序的性能,我们可以生成一个较大规模的随机数组,并与其他常见排序算法(如冒泡排序)进行比较。

import random
import time

# 生成随机数组
arr = [random.randint(1, 1000) for _ in range(10000)]

# 快速排序计时
start_time = time.time()
sorted_arr_quick = quick_sort(arr.copy())
quick_sort_time = time.time() - start_time

# 冒泡排序
def bubble_sort(arr):
    n = len(arr)

    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1] :
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

# 冒泡排序计时
start_time = time.time()
sorted_arr_bubble = bubble_sort(arr.copy())
bubble_sort_time = time.time() - start_time

print(f"快速排序时间: {quick_sort_time} 秒")
print(f"冒泡排序时间: {bubble_sort_time} 秒")

通过实际测试可以发现,快速排序在处理大规模数据时,性能远远优于冒泡排序,充分展现了其作为速度之王的优势。

然而,快速排序也并非完美无缺。在某些特殊情况下,例如数组已经基本有序或者数据规模较小,快速排序的性能可能会受到影响。但在大多数实际应用中,特别是对于大规模数据的排序,快速排序的递归魔法和高效性使其成为首选的排序算法之一。

相关文章
|
13天前
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【8月更文挑战第5天】随着互联网应用规模增长,性能测试至关重要。本文介绍如何利用Python结合Apache JMeter和Locust构建高效可定制的性能测试框架。JMeter广泛用于负载测试,通过模拟大量虚拟用户并发访问来评估性能。Locust基于Python,通过编写简单脚本模拟HTTP请求,特别适合Web应用测试,比JMeter更灵活易扩展。Python作为胶水语言简化测试脚本编写并流畅自动化流程。文章提供JMeter命令行测试和Locust脚本示例,并展示如何用Python自动化执行和整合测试结果,最终帮助应用在高负载下稳定运行。
30 1
|
3天前
|
程序员 数据库连接 API
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
|
29天前
|
存储 缓存 算法
python性能问题(Performance Issues)
【7月更文挑战第19天】
34 5
python性能问题(Performance Issues)
|
12天前
|
监控 Java 测试技术
实战派必看!Python性能测试中,JMeter与Locust如何助力性能调优
【8月更文挑战第6天】性能优化是软件开发的关键。本文介绍JMeter与Locust两款流行性能测试工具,演示如何用于Python应用的性能调优。JMeter可模拟大量用户并发访问,支持多种协议;Locust用Python编写,易于定制用户行为并模拟高并发。根据场景选择合适工具,确保应用在高负载下的稳定运行。
32 4
|
12天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【8月更文挑战第6天】在数字化时代,确保软件在高并发下的稳定性至关重要。Python 提供了强大的性能测试工具,如 JMeter 和 Locust。JMeter 可配置复杂请求场景,而 Locust 则以 Python 脚本灵活模拟真实用户行为。两者结合,可全面评估系统性能。例如,对电商网站进行测试时,JMeter 模拟登录请求,Locust 定义浏览和购物行为,共同揭示系统瓶颈并指导优化,从而保证稳定高效的用户体验。
26 1
|
26天前
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
33 7
|
27天前
|
机器学习/深度学习 存储 数据可视化
特征选择的艺术:利用Scikit-learn提升模型性能
【7月更文第22天】在机器学习的实践中,特征选择是一项至关重要的步骤,它直接影响到模型的性能、训练速度以及对新数据的泛化能力。特征选择,或称为变量选择,旨在从原始特征集中识别并保留最相关、最有影响力的特征子集,同时剔除冗余或无关紧要的特征。本文将探讨特征选择的重要性,并通过使用Python中的Scikit-learn库演示几种有效的特征选择方法,以提升模型性能。
45 4
|
1月前
|
缓存 Python
Python中递归错误
【7月更文挑战第17天】
26 8
|
6天前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
19 0
|
30天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
【7月更文挑战第19天】Trie树,又称前缀树,是优化字符串搜索的高效数据结构。通过利用公共前缀,Trie树能快速插入、删除和查找字符串。
47 2