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

【排序算法】典型排序算法和python 实现

以下是排序算法的分类及经典Python实现,包含时间复杂度、空间复杂度与稳定性说明:


一、比较类排序(通过元素间比较决定顺序)

1. 交换排序
  1. 冒泡排序
    时间复杂度:O(n²)(最优O(n)已优化)
    空间复杂度:O(1)
    稳定性:稳定

    def bubble_sort(arr):n = len(arr)for i in range(n):swapped = Falsefor j in range(n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = Trueif not swapped: break  # 提前终止优化return arr
    
  2. 快速排序
    时间复杂度:平均O(n log n),最差O(n²)
    空间复杂度:O(log n)(递归栈)
    稳定性:不稳定

    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)
    
2. 插入排序
  1. 直接插入排序
    时间复杂度:O(n²)(最优O(n))
    空间复杂度:O(1)
    稳定性:稳定
    def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = keyreturn arr
    
3. 选择排序
  1. 简单选择排序
    时间复杂度:O(n²)
    空间复杂度:O(1)
    稳定性:不稳定
    def selection_sort(arr):for i in range(len(arr)):min_idx = ifor j in range(i+1, len(arr)):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arr
    
4. 归并排序

时间复杂度:O(n log n)
空间复杂度:O(n)
稳定性:稳定

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):res = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:res.append(left[i])i += 1else:res.append(right[j])j += 1res.extend(left[i:] or right[j:])return res

二、非比较类排序(利用数值特征避免元素间比较)

1. 计数排序

时间复杂度:O(n + k)(k为数据范围)
空间复杂度:O(n + k)
稳定性:稳定(反向填充时)
适用场景:整数且范围较小

def counting_sort(arr):max_val = max(arr)count = [0] * (max_val + 1)for num in arr:count[num] += 1res = []for i in range(len(count)):res.extend([i] * count[i])return res
2. 基数排序

时间复杂度:O(nk)(k为最大位数)
空间复杂度:O(n + k)
稳定性:稳定

def radix_sort(arr):max_val = max(arr)exp = 1while max_val // exp > 0:buckets = [[] for _ in range(10)]for num in arr:buckets[(num // exp) % 10].append(num)arr = [num for bucket in buckets for num in bucket]exp *= 10return arr
3. 桶排序

时间复杂度:平均O(n + k),最差O(n²)
空间复杂度:O(n + k)
适用场景:均匀分布的数据

def bucket_sort(arr, bucket_size=5):min_val, max_val = min(arr), max(arr)bucket_count = (max_val - min_val) // bucket_size + 1buckets = [[] for _ in range(bucket_count)]for num in arr:idx = (num - min_val) // bucket_sizebuckets[idx].append(num)res = []for bucket in buckets:res.extend(sorted(bucket))return res

三、总结对比

算法最优时间平均时间最差时间空间稳定适用场景
冒泡排序O(n)O(n²)O(n²)O(1)教学示例
快速排序O(n log n)O(n log n)O(n²)O(log n)通用高效排序
归并排序O(n log n)O(n log n)O(n log n)O(n)外部排序、稳定需求
计数排序O(n + k)O(n + k)O(n + k)O(n + k)小范围整数
基数排序O(nk)O(nk)O(nk)O(n + k)多位数整数

根据数据规模与类型选择合适算法:小数据用简单排序(如插入),大数据优先选O(n log n)算法,特定场景使用非比较排序。

http://www.xdnf.cn/news/633493.html

相关文章:

  • 如何使用HiveSQL实现2个字符串间的映射及排序
  • 【排序算法】典型排序算法 Java实现
  • 【排序算法】冒泡排序详解--附详细流程代码
  • CVE-2017-5645源码分析与漏洞复现(反序列化)
  • idea 快捷键大全
  • RabbitMQ核心机制——延迟队列
  • mysql:MVCC机制
  • 【Android】基于SurfaceControlViewHost实现跨进程渲染
  • 【GitHub Pages】部署指南
  • 微信小程序 --三剑客
  • 基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程
  • 人工智能数学基础实验(三):最小二乘法-数值计算
  • CSS布局(上):浮动基础
  • 使用Python,OpenCV,Tesseract-OCR对自己的运动数据图片进行识别及分析,并使用Matplotlib绘制配速图出来
  • Ubuntu 24.04部署安装Honeyd蜜罐
  • Go 语言基础 2 Func,流程控制
  • Kubernetes(k8s)全面解析:从入门到实践
  • how to do unit test for golang within vscode
  • CentOS 7.6 + Docker:搭建后端常用的开发环境
  • 使用CentOS部署本地DeekSeek
  • PDF 编辑批量拆分合并OCR 识别
  • 非常适合初学者的Golang教程
  • TDengine 对接微软 SSRS 报表系统
  • Go 语言学习 Protobuf 连接 gRPC 实现 AI 接口
  • Linux 的编辑器--vim
  • 初识消息队列
  • C++单例模式与线程安全
  • webpack面试问题
  • 理解HTTP基本认证与表单登录认证
  • 自动化安全脚本学习