实战Python快速排序:深入学习算法步骤

       


概要

快速排序是一种常用的排序算法,它通过分治的思想将一个大问题拆分成多个小问题,并逐步解决这些小问题,最终完成排序。本文将深入讨论快速排序的算法原理和Python实现。


快速排序算法原理

快速排序的基本思想是选取一个基准元素(通常是数组的第一个元素),将数组中小于基准元素的元素移到基准元素的左边,将大于基准元素的元素移到右边。然后,对左右两个子数组分别进行快速排序,直到整个数组有序。

Python实现示例

下面是一个基本的快速排序Python实现示例:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = arr[0]
    left = []
    right = []

    for element in arr[1:]:
        if element < pivot:
            left.append(element)
        else:
            right.append(element)

    return quick_sort(left) + [pivot] + quick_sort(right)

# 测试快速排序
my_list = [3, 6, 8, 10, 1, 2, 1]
sorted_list = quick_sort(my_list)
print(sorted_list)  # 输出结果:[1, 1, 2, 3, 6, 8, 10]

优化快速排序

虽然上述示例已经演示了快速排序的基本原理,但还有一些方法可以进一步优化算法的性能。以下是一些优化技巧:

1. 随机选择基准元素

选择基准元素时,可以随机选择数组中的一个元素,而不仅仅是第一个元素。这样可以降低最坏情况发生的概率,进一步提高算法性能。

import random

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = random.choice(arr)
    left = []
    right = []

    for element in arr:
        if element < pivot:
            left.append(element)
        elif element > pivot:
            right.append(element)

    return quick_sort(left) + [pivot] + quick_sort(right)

2. 三元素取中法

在选择基准元素时,可以考虑使用三元素取中法,即选择数组的第一个、中间一个和最后一个元素中的中位数作为基准元素。这可以降低最坏情况的概率,并进一步提高性能。

def choose_pivot(arr):
    first = arr[0]
    middle = arr[len(arr) // 2]
    last = arr[-1]
    if first < middle < last or last < middle < first:
        return middle
    elif middle < first < last or last < first < middle:
        return first
    else:
        return last

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = choose_pivot(arr)
    left = []
    right = []

    for element in arr:
        if element < pivot:
            left.append(element)
        elif element > pivot:
            right.append(element)

    return quick_sort(left) + [pivot] + quick_sort(right)

这些优化技巧可以进一步提高快速排序的性能和稳定性。

递归与迭代

在前面的示例中,展示了使用递归实现快速排序的方法。虽然递归是一种直观且易于理解的方法,但在处理大型数据集时可能会导致栈溢出。为了避免这种情况,可以考虑使用迭代方法来实现快速排序。

以下是使用迭代方法实现快速排序的示例代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    stack = [(0, len(arr) - 1)]

    while stack:
        low, high = stack.pop()
        if low < high:
            pivot_index = partition(arr, low, high)
            if pivot_index > low:
                stack.append((low, pivot_index - 1))
            if pivot_index < high:
                stack.append((pivot_index + 1, high))

def partition(arr, low, high):
    pivot = arr[high]
    i = low - 1

    for j in range(low, high):
        if arr[j] <= pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]

    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

这个迭代版本的快速排序使用一个栈来跟踪待处理的子数组范围,而不是递归调用。这可以有效地避免栈溢出的问题。

总结

本文深入探讨了如何使用Python实现快速排序算法,这是一种高效的排序方法。我们从算法的基本原理入手,详细讲解了快速排序的步骤和核心思想,包括如何选择基准元素、如何划分子数组以及如何递归调用算法。示例代码清晰地展示了算法的实际实现过程,使读者能够更好地理解和运用快速排序。

此外,还介绍了快速排序的优化策略,如随机选择基准元素和三元素取中法,以提高算法在特定情况下的性能。这些优化方法可以降低最坏情况的出现概率,使快速排序在各种输入数据情况下都能表现出色。

在性能和应用方面,本文强调了快速排序在平均情况下具有出色的时间复杂度(O(n log n)),适用于大多数排序任务。然而,也需要注意到最坏情况下的时间复杂度可能达到O(n^2),因此在实际应用中需要谨慎选择算法。

通过本文,大家可以全面了解快速排序算法的工作原理、实现方式以及优化方法。快速排序不仅是一种重要的排序算法,还是计算机科学和编程中的经典算法之一。希望本文的内容和示例代码能够帮助大家更好地理解和应用快速排序,提高其编程技能和算法思维。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scrollTop与offsetTop解决小分辨率区域块向上滚动效果效果,结合animation与@keyframes实现标题左右闪动更换颜色效果。

scrollTop 是一个属性&#xff0c;它表示元素的滚动内容垂直滚动条的位置。对于可滚动元素&#xff0c;scrollTop 属性返回垂直滚动条滚动的像素数&#xff0c;即元素顶部被隐藏的像素数。 offsetTop 是一个属性&#xff0c;用于获取一个元素相对于其父元素的垂直偏移量&…

c++ oatpp api服务端取get参数,post内容

最近用oatpp做接口,部分功能已经上线,比较简单 1,取post json 如上图 post application/json 格式 首先定义post路由路径 router->route("POST", "/Getxxx", std::make_shared<Handler_Getxxx>()); 然后我们完成Handler_Getxxx 函数,…

怎么用ATECLOUD-POWER开关电源测试系统测量交直流电源功率?

直流电源功率和交流电源功率 电源功率是用来描述电源输出能力的指标&#xff0c;电源功率的大小直接关系到电子设备的性能和功能。电源功率越大&#xff0c;提供的电能就越多&#xff0c;从而也可以适用于大功率电子设备的运行。 电源功率包括直流电源功率和交流电源功率。 1. …

【Python】使用tkinter设计开发Windows桌面程序记事本(1)

下一篇&#xff1a; 记事本介绍 电脑记事本是一种简单的文本编辑器&#xff0c;用于在电脑上创建、编辑和存储文本文件。它通常被用作轻量级的文本编辑工具&#xff0c;适用于简单的文本编辑任务&#xff0c;如写日记、做笔记、编写代码等。以下是对电脑记事本的详细介绍&…

【LLM 论文阅读】NEFTU N E: LLM微调的免费午餐

指令微调的局限性 指令微调对于训练llm的能力至关重要&#xff0c;而模型的有用性在很大程度上取决于我们从小指令数据集中获得最大信息的能力。在本文中&#xff0c;我们提出在微调正向传递的过程中&#xff0c;在训练数据的嵌入向量中添加随机噪声&#xff0c;论文实验显示这…

k8s的存储卷

存储卷------数据卷 把容器内的目录&#xff0c;和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制&#xff08;deployment&#xff09;创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 …

中国京津冀光伏展

京津冀在中国光伏展是中国光伏行业的一次重要展览活动&#xff0c;旨在推动京津冀地区光伏产业的发展和合作&#xff0c;促进全国光伏产业的健康发展。 京津冀地区是中国光伏产业的重要基地之一&#xff0c;拥有丰富的太阳能资源和发展潜力。中国光伏展作为光伏行业的盛会&…

firewall防火墙(二)

一、IP伪装与端口转发&#xff1a; 当用户数据包经过NAT设备时&#xff0e;NAT设备将源地址替换为公网P地址&#xff0e;而返回的数据包就可以被路由&#xff0c;NAT技术一般都是在企业边界路由器或者防火墙上来配置. Firewaild支持两种类型的NAT;P地址伪装和端口转发. 1.1 I…

优化 ParamValidator,让编辑器Pycharm智能提示校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 基于 Valid…

鱼哥赠书活动第⑥期:《内网渗透实战攻略》看完这本书教你玩转内网渗透测试成为实战高手!!!!

鱼哥赠书活动第⑥期&#xff1a;《内网渗透实战攻略》 如何阅读本书&#xff1a;本书章节介绍&#xff1a;本书大致目录&#xff1a;适合阅读对象&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; 当今&#xff0c;网络系统面临着越来越严峻的安全挑战。在众多的安全挑战中&…

产品使用说明书也能进行SEO?要怎么制作才能使其易于搜索?

产品使用说明书也能进行SEO&#xff1f;是的&#xff0c;你没有听错&#xff0c;不过是在线化的产品使用说明书。产品使用说明书能通过特定的策略和技巧进行搜索引擎优化&#xff08;SEO&#xff09;。这不只是为了让产品信息更易被找到&#xff0c;更是为了提升品牌知名度和用…

ubuntu20.04安装cuda11.4以及cudnn

系统&#xff1a;ubuntu20.04硬件配置&#xff1a;GPU3080、CPU未知通过《软件和更新》在附加驱动选项中添加了驱动&#xff1a; 1.检查自己电脑支持的cuda nvidia-smi4. 下载cuda11.4.2 wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/c…

昇腾910b部署qwen-7b-chat进行流式输出【pytorch框架】NPU推理

文章目录 准备阶段避坑阶段解决方案一、modeling_qwen.py二、cli_demo.py 结果展示 准备阶段 参考我上一篇文章910b上跑Chatglm3-6b进行流式输出【pytorch框架】 避坑阶段 我在mindspore框架下运行了qwen-7b-base、qwen-7b-chat输出都有大大的问题&#xff0c;参考官方文档 …

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

视频监控系统EasyCVR如何通过调用API接口查询和下载设备录像?

智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联…

oracle基本用户管理和权限分配

1.用户与模式的关系&#xff0c;一一对应的关系 2.创建与管理用户 2.1创建用户语法 CREATE user wdf IDENTIFIED by tiger--创建用户wdf,密码tiger DEFAULT tablespace users--用户的默认表空间 quota 10M on users;--在表空间的占用最大空间 注意&#xff1a;用户创建以后…

基于TableAgent实现IT职位招聘数据分析—以传统机器学习与TableAgent 数据分析方式相对比以凸显TableAgent 特性

目录 &#x1f680;一. TableAgent—新AI时代的数据分析智能体 &#x1f50e;1.1 基于DataCanvas Alaya九章元识大模型 &#x1f50e;1.2 TableAgent的亮点 &#x1f680;二. 使用TableAgent分析数据与传统机器学习分析数据对比 &#x1f50e;2.1 项目背景 &#x1f50e;2.2 数…

统信UOS命令行设置未签名软件安装权限

原文链接&#xff1a;统信UOS命令行设置未签名软件安装权限 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在统信UOS操作系统上通过命令行设置安全中心应用安装权限的方法。在某些情况下&#xff0c;用户可能需要安装未经官方签名的软件包。虽然这可以提供更多…

在python里面探索web框架

一、常识性知识 python Web框架三巨头&#xff1a;Flask&#xff08;简单易学&#xff09;、Django(复杂庞大)、FastAPI 1. Django&#xff1a;Django是一个高级的Web框架&#xff0c;它提供了强大的功能和工具&#xff0c;用于快速开发复杂的Web应用程序。 2. Flask&#xff…