当前位置: 首页 > news >正文

【Python练习】044. 编写一个函数,实现快速排序算法

044. 编写一个函数,实现快速排序算法

  • 044. 编写一个函数,实现快速排序算法
    • 示例代码
      • 运行结果
      • 代码解释
    • 扩展:原地快速排序
      • 运行结果
      • 代码解释
    • 注意事项
    • 实现方法
      • 基础实现(原地排序)
      • 原地分区实现(更高效)
      • 使用lambda表达式
      • 随机化快速排序
      • 迭代实现

044. 编写一个函数,实现快速排序算法

快速排序是一种高效的排序算法,使用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。

示例代码

def quick_sort(arr):"""快速排序函数。参数:arr (list): 输入数组。"""if len(arr) <= 1:return arr  # 如果数组长度小于等于1,直接返回数组else: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)  # 递归排序左右子序列并合并# 测试代码
arr = [3, 6, 8, 10, 1, 2, 1]
print("原始数组:", arr)
sorted_arr = quick_sort(arr)
print("排序后的数组:", sorted_arr)

运行结果

运行上述代码后,输出如下:

原始数组: [3, 6, 8, 10, 1, 2, 1]
排序后的数组: [1, 1, 2, 3, 6, 8, 10]

代码解释

基本情况

  • 如果数组长度小于等于 1,直接返回数组,因为长度为 1 的数组已经是有序的。

选择基准

  • 选择数组中间的元素作为基准(pivot)。也可以选择第一个元素、最后一个元素或随机元素作为基准。

划分数组

  • 使用列表推导式将数组分为三部分:

  • left:小于基准的元素。

  • middle:等于基准的元素。

  • right:大于基准的元素。

递归排序

  • 递归地对 leftright 子序列进行快速排序。

  • 最后将排序后的 left 子序列、middle 和排序后的 right 子序列合并。

扩展:原地快速排序

上述实现使用了额外的空间来存储 leftmiddleright 子序列。为了节省空间,可以实现原地快速排序。以下是原地快速排序的实现代码:

def quick_sort_inplace(arr, low, high):
http://www.lryc.cn/news/588965.html

相关文章:

  • 本地电脑安装Dify|内网穿透到公网
  • 开源AI应用开发平台Dify系列(一)
  • YOLO融合CFFormer中的FeatureCorrection_s2c模块
  • 多租户SaaS系统中设计安全便捷的跨租户流程共享
  • 遥感数据与作物生长模型同化及在作物长势监测与估产中的应用
  • 弗兰肯斯坦式的人工智能与GTM策略的崩溃
  • 运维效率提升利器:grep、sed、awk详解与实战练习指南
  • (LeetCode 面试经典 150 题) 383. 赎金信 (哈希表)
  • AR眼镜:重塑医学教育,开启智能教学新时代
  • 配置使用SSH与VScode进行连接
  • dockerfile 最佳实践
  • 如何解决服务器频繁重启的问题?
  • 流媒体直播分发服务器
  • 基于深度学习的LSTM、GRU对大数据交通流量分析与预测的研究
  • Python初学者笔记第十二期 -- (集合与字典编程练习题)
  • 信息学奥赛一本通 1552:【例 1】点的距离
  • 短剧小程序的「技术革命」:从「粗放生长」到「精准运营」
  • MySQL中的“引擎“是什么意思
  • 【算法-BFS 解决最短路问题】探索BFS在图论中的应用:最短路径问题的高效解法
  • UnitTest测试框架的基本使用方法(详细介绍)
  • Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法
  • 博客项目 laravel vue mysql 第六章 文章功能
  • WPF中的ListBox详解
  • QTableView鼠标双击先触发单击信号
  • 3. ArrayList与LinkedList的区别
  • Redis的下载安装+基础操作+redis客户端的安装
  • Java :List,LinkedList,ArrayList
  • 23种设计模式--#1工厂模式
  • CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(一)
  • AI Agent 开发