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

Python 3 中 快速排序 和 归并排序

Python 3 中 快速排序归并排序

文章目录

      • 1. 快速排序实现:
        • 快速排序代码实现:
      • 2. 归并排序实现:
        • 归并排序代码实现:
      • 3. 快速排序和归并排序的对比:
      • 总结:

1. 快速排序实现:

快速排序采用 分治法,选择一个基准元素(pivot),将数组分成两部分,分别排序。

快速排序代码实现:
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)

# 示例数组
arr = [10, 7, 8, 9, 1, 5]

# 调用快速排序函数
sorted_arr_quick = quick_sort(arr)

# 输出排序后的数组
print("Quick Sort Result:", sorted_arr_quick)

2. 归并排序实现:

归并排序同样是 分治法,但它通过递归将数组分割成更小的部分,最终将小部分合并起来。

归并排序代码实现:
def merge_sort(arr):
    # 基本情况:如果数组只有一个元素,则无需排序
    if len(arr) <= 1:
        return arr
    
    # 递归分割数组
    mid = len(arr) // 2  # 取数组的中间索引
    left_half = merge_sort(arr[:mid])  # 递归排序左半部分
    right_half = merge_sort(arr[mid:])  # 递归排序右半部分
    
    # 合并两个已排序的子数组
    return merge(left_half, right_half)

def merge(left, right):
    sorted_arr = []
    i = j = 0
    
    # 比较两个数组的元素,按升序合并
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            sorted_arr.append(left[i])
            i += 1
        else:
            sorted_arr.append(right[j])
            j += 1
    
    # 将剩余的元素加入结果数组
    sorted_arr.extend(left[i:])  # 如果左边还有元素
    sorted_arr.extend(right[j:])  # 如果右边还有元素
    
    return sorted_arr

# 示例数组
arr = [10, 7, 8, 9, 1, 5]

# 调用归并排序函数
sorted_arr_merge = merge_sort(arr)

# 输出排序后的数组
print("Merge Sort Result:", sorted_arr_merge)

3. 快速排序和归并排序的对比:

特性快速排序 (Quick Sort)归并排序 (Merge Sort)
时间复杂度最优:O(n log n),最坏:O(n²),平均:O(n log n)O(n log n)(最坏、最优和平均时间复杂度均相同)
空间复杂度O(log n)(递归调用栈的空间)O(n)(需要额外的数组来存储合并结果)
稳定性不稳定稳定
适用场景当数据集较小或者排序部分已经大体有序时,快速排序较为高效。适合需要稳定排序的场景,或者数据集较大时,特别是外部排序。
实现难度较简单,但需要注意最坏情况的处理。相对复杂,尤其是合并过程的实现。
实际表现对大部分随机数组,性能非常好。对大数据集性能较为稳定,适合处理大型数据集。

总结:

  • 快速排序 在大部分情况下表现非常好,但最坏情况下的时间复杂度是 O(n²),特别是当数组已经基本有序或逆序时。
  • 归并排序 总是有稳定的 O(n log n) 时间复杂度,适合稳定排序和处理非常大的数据集,特别是当数据无法完全装入内存时。

如果排序的数组较小,快速排序通常会更快一些,因为它的常数项比较小;而归并排序虽然稳定且时间复杂度较好,但它的额外空间开销较大。

相关文章:

  • matlab和java混合编程经验分享
  • 迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-修改HCS配置
  • Python logger模块
  • 路由器的WAN口和LAN口有什么区别?
  • 1.14作业
  • 动态存储斐波那契数列(递归优化)
  • 基于AVue的二次封装:快速构建后台管理系统的CRUD方案
  • synchronized锁字符串
  • 语音直播交友app出海:语音直播交友系统软件源码搭建国际化发展技术层面分析
  • SHELL32!SHLoadPopupMenu函数分析之添加属性菜单项
  • Ubuntu22.04 - etcd的安装和使用
  • AI大模型发展对语音直播交友系统源码开发搭建的影响
  • python-leetcode-搜索二维矩阵 II
  • 实战:利用百度站长平台加速网站收录
  • Spring Boot 中事务的用法详解
  • 雷龙CS贴片式NAND芯片应用实践-大容量存储与多媒体设备的完美融合
  • Effective C++ 读书笔记(十二)
  • Perl 面向对象编程指南
  • 17-最长公共前缀
  • Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(1)
  • 德阳手机网站建设/关键词分析工具
  • 网站asp文件只读/推广宣传文案
  • html5手机网站模板 下载/活动推广文案
  • 周口哪里有做网站的/windows优化大师
  • 做app挣钱还是网站/网络推广怎么赚钱
  • 镇江网站推广/如何注册一个自己的网站