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

快速排序代码实现详解

快速排序代码实现详解

快速排序(Quick Sort)是一种高效的分治算法,平均时间复杂度为 ​O(n log n)​。其核心思想是选择一个基准元素(pivot),将数组划分为两部分:小于基准的部分和大于基准的部分,然后递归地对这两部分排序。


快速排序步骤:
  1. 选择基准​:从数组中选择一个元素作为基准(pivot)。

  2. 分区操作​:重新排列数组,所有小于基准的元素放在基准左侧,大于基准的元素放在右侧。

  3. 递归排序​:对左右子数组递归执行上述步骤。


Python 代码实现
def quick_sort(arr):if len(arr) <= 1:return arrpivot = 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]
sorted_arr = quick_sort(arr)
print("Sorted array:", sorted_arr)

原地分区版本(优化空间复杂度)

上述实现需要额外空间。以下是原地分区的优化版本(空间复杂度 ​O(log n)​):

def quick_sort_inplace(arr, low=0, high=None):if high is None:high = len(arr) - 1if low < high:pivot_index = partition(arr, low, high)quick_sort_inplace(arr, low, pivot_index - 1)  # 递归排序左半部分quick_sort_inplace(arr, pivot_index + 1, high)  # 递归排序右半部分def partition(arr, low, high):pivot = arr[high]  # 选择最后一个元素作为基准i = low - 1  # i 是小于基准的区域的边界for j in range(low, high):if arr[j] <= pivot:i += 1arr[i], arr[j] = arr[j], arr[i]  # 交换元素arr[i + 1], arr[high] = arr[high], arr[i + 1]  # 将基准放到正确位置return i + 1  # 返回基准的最终位置# 测试
arr = [3, 6, 8, 10, 1, 2, 1]
quick_sort_inplace(arr)
print("Sorted array:", arr)

关键步骤解析(以原地分区为例):
  1. 选择基准​:通常选最后一个元素(arr[high])。

  2. 分区过程​:

    • 指针 i标记小于基准的子数组的末尾。

    • 遍历数组(jlowhigh-1),若当前元素 arr[j] <= pivot,则将其交换到 i+1的位置。

    • 最后将基准交换到 i+1的位置,此时基准左侧全小于它,右侧全大于它。

  3. 递归​:对左右子数组重复上述过程。


时间复杂度分析:
  • 最佳/平均情况​:O(n log n)

    每次分区将数组均匀分成两部分。

  • 最坏情况​:O(n²)

    当数组已有序且基准选择不当(如总是选最大/最小元素)。

  • 优化​:随机选择基准可避免最坏情况:

    import random
    pivot_index = random.randint(low, high)
    arr[pivot_index], arr[high] = arr[high], arr[pivot_index]  # 将随机基准移到末尾

特点总结:
  • 不稳定排序​:相同元素的相对位置可能改变。

  • 空间复杂度​:递归栈深度 O(log n)(原地分区版本)。

  • 适用场景​:大数据量且对稳定性无要求时效率高。

通过理解分区过程和递归思想,可以轻松掌握快速排序的核心逻辑!

http://www.dtcms.com/a/525160.html

相关文章:

  • 社会工程学全解析:从原理到实战
  • 基于LSTM的多变量时间序列预测创新路径
  • gofair做网站seo规范培训
  • 网站做充值和提现优化企业网站标题
  • 【 RocketMQ 全解析】分布式消息队列的架构、消息转发与快速实践、事务消息
  • k8s上配置canal用的zookeeper为什么需要用两个service?
  • 基于Springboot + vue3实现的房屋买卖平台
  • 网站设计分辨率网站遇到攻击时应该怎么做
  • date-fns 现代 JavaScript 日期实用程序库(基础篇)上
  • 调整为 dart-sass 支持的语法,将深度选择器/deep/调整为::v-deep
  • 做设计常用网站有哪些怎样注册公司流程
  • Less:让CSS开发更简单的预处理器
  • 生态文明建设网站企业管理者培训查询
  • 用腾讯云做淘宝客购物网站视频商城平台开发公司
  • ASE04-冰冻效果
  • 宁波建设业协会网站宜黄县建设局网站
  • 详细解释 std::thread t1(ThreadPrinter::print, printer, 1);
  • 云建站的正确步骤客户关系crm管理系统
  • RocketMQ核心技术精讲-----初识RocketMQ与快速上手
  • 青岛的互联网公司有哪些西安做网站优化
  • 香橙派双雄:OPi 6 Plus与4 Pro,以差异化战略切割边缘AI市场
  • openai-cookbook:what makes documentation good(翻译总结)
  • 智能网联汽车网络发展需求与模式分析:面向2030年的核心逻辑
  • java transient关键字有什么用
  • 免费建站哪个比较好大学 生免费商业网站设计
  • perl网站开发企业培训内容有哪些
  • 医疗信创的里程碑:浙江省人民医院异构多活容灾架构的突破与启示
  • KingbaseES数据库:首个多院区异构多活容灾架构,浙人医创新开新篇
  • 标注可用于IP≠实战可用——超50%的IP抗体实际效果欠佳,如何实现0风险IP实验?
  • 建设人才证书查询网站做网站的公司北京有哪些