排序算法-python实现
算法分类与核心特性
算法名称 时间复杂度(平均) 最佳情况 最坏情况 空间复杂度 稳定性 原地排序 适用场景 冒泡排序 O(n²) O(n) O(n²) O(1) ✅ ✅ 小规模数据(教学演示) 插入排序 O(n²) O(n) O(n²) O(1) ✅ ✅ 小规模/部分有序数据 选择排序 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 log n) O(n log n) O(n log n) O(1) ❌ ✅ 原地排序(服务器TPS测试) 计数排序 O(n+k) O(n+k) O(n+k) O(k) ✅ ❌ 小范围整数排序(传感器数据)
分算法详解
1. 冒泡排序(Bubble Sort)
def bubble_sort ( arr) : n = len ( arr) for i in range ( n) : swapped = False for j in range ( n- i- 1 ) : if arr[ j] > arr[ j+ 1 ] : arr[ j] , arr[ j+ 1 ] = arr[ j+ 1 ] , arr[ j] swapped = True if not swapped: break return arr
核心优化 :提前终止机制嵌入式适配 :STM32内存受限场景下的原地排序测试用例 :
assert bubble_sort( [ 5 , 3 , 8 , 1 ] ) == [ 1 , 3 , 5 , 8 ]
assert bubble_sort( [ - 5 , 0 , 3 ] ) == [ - 5 , 0 , 3 ]
2. 插入排序(Insertion Sort)
def insertion_sort ( arr) : for i in range ( 1 , len ( arr) ) : key = arr[ i] j = i - 1 while j >= 0 and key < arr[ j] : arr[ j + 1 ] = arr[ j] j -= 1 arr[ j + 1 ] = keyreturn arr
性能优化 :二分查找插入位置项目关联 :LVGL库移植中的触摸坐标排序边界处理 :j >=0
防止数组越界
3. 选择排序(Selection Sort)
def selection_sort ( arr) : """选择排序实现(原地排序,内存敏感场景优选)Args:arr (list): 待排序的列表Returns:list: 排序后的列表Example:>>> selection_sort([64, 25, 12, 22, 11])[11, 12, 22, 25, 64]""" n = len ( arr) for i in range ( n) : min_idx = i for j in range ( i+ 1 , n) : if arr[ j] < arr[ min_idx] : min_idx = jarr[ i] , arr[ min_idx] = arr[ min_idx] , arr[ i] return arr
核心特性 : 原地排序:空间复杂度O(1),适合嵌入式系统 时间复杂度:O(n²)(无论最好/最坏情况) 非稳定排序:可能改变相等元素的相对顺序 交换次数最少:只有n次交换(适合写操作昂贵的场景)
4. 快速排序(Quick Sort)
def quick_sort ( arr) : if len ( arr) <= 1 : return arrpivot = arr[ 0 ] for i in range ( 1 , len ( arr) ) : key = arr[ i] j = i - 1 while j >= 0 and key < arr[ j] : arr[ j + 1 ] = arr[ j] j -= 1 arr[ j + 1 ] = keyreturn arr
三数取中改进 :避免最坏O(n²)情况服务器测试 :网卡打流测试数据的快速切分
5. 归并排序(Merge Sort)
def merge_sort ( arr) : """归并排序实现(分治策略,稳定排序)Args:arr (list): 待排序的列表Returns:list: 排序后的列表Example:>>> merge_sort([3, 6, 8, 10, 1, 2, 1])[1, 1, 2, 3, 6, 8, 10]""" if len ( arr) <= 1 : return arrmid = len ( arr) // 2 left_half = merge_sort( arr[ : mid] ) right_half = merge_sort( arr[ mid: ] ) merged = [ ] i = j = 0 while i < len ( left_half) and j < len ( right_half) : if left_half[ i] <= right_half[ j] : merged. append( left_half[ i] ) i += 1 else : merged. append( right_half[ j] ) j += 1 merged. extend( left_half[ i: ] ) merged. extend( right_half[ j: ] ) return merged
核心特性 : 稳定排序:保持相等元素的相对顺序 分治策略:递归分解+有序合并 链表适配:特别适合链表结构排序(无需额外空间)
6. 堆排序(Heap Sort)
def _heapify ( arr, n, i) : """维护堆结构""" largest = ileft = 2 * i + 1 right = 2 * i + 2 if left < n and arr[ left] > arr[ largest] : largest = leftif right < n and arr[ right] > arr[ largest] : largest = rightif largest != i: arr[ i] , arr[ largest] = arr[ largest] , arr[ i] _heapify( arr, n, largest) def heap_sort ( arr) : n = len ( arr) for i in range ( n// 2 - 1 , - 1 , - 1 ) : _heapify( arr, n, i) for i in range ( n- 1 , 0 , - 1 ) : arr[ i] , arr[ 0 ] = arr[ 0 ] , arr[ i] _heapify( arr, i, 0 ) return arr
核心特性 : 原地排序:空间复杂度O(1),适合嵌入式系统 时间复杂度:O(n log n)(无论最好/最坏情况) 非稳定排序:可能改变相等元素的相对顺序 二叉堆结构:完全二叉树的数组表示
7. 计数排序(Counting Sort)
def counting_sort ( arr) : """计数排序实现(非比较型排序,适用于小范围整数)Args:arr (list): 待排序的整数列表Returns:list: 排序后的列表Example:>>> counting_sort([4, 2, 2, 8, 3, 3, 1])[1, 2, 2, 3, 3, 4, 8]""" if not arr: return [ ] min_val, max_val = min ( arr) , max ( arr) range_size = max_val - min_val + 1 count = [ 0 ] * range_sizefor num in arr: count[ num - min_val] += 1 sorted_arr = [ ] for i in range ( range_size) : sorted_arr. extend( [ i + min_val] * count[ i] ) return sorted_arr
核心特性 : 非比较型排序:突破O(n log n)下限 时间复杂度:O(n+k),k为数值范围 空间复杂度:O(k),需要额外存储空间 稳定性:通过后进先出策略保持稳定
算法选择决策树
数据规模?
├─ 小规模(n<1000) → 插入排序
├─ 大规模 → 分治类
│ ├─ 需稳定 → 归并排序d
│ └─ 不需稳定 → 快速排序
└─ 特殊数据├─ 整数且集中 → 计数排序└─ 硬件相关 → 堆排序
排序算法-python实现
算法分类与核心特性
算法名称 时间复杂度(平均) 最佳情况 最坏情况 空间复杂度 稳定性 原地排序 适用场景 冒泡排序 O(n²) O(n) O(n²) O(1) ✅ ✅ 小规模数据(教学演示) 插入排序 O(n²) O(n) O(n²) O(1) ✅ ✅ 小规模/部分有序数据 选择排序 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 log n) O(n log n) O(n log n) O(1) ❌ ✅ 原地排序(服务器TPS测试) 计数排序 O(n+k) O(n+k) O(n+k) O(k) ✅ ❌ 小范围整数排序(传感器数据)
分算法详解
1. 冒泡排序(Bubble Sort)
def bubble_sort ( arr) : n = len ( arr) for i in range ( n) : swapped = False for j in range ( n- i- 1 ) : if arr[ j] > arr[ j+ 1 ] : arr[ j] , arr[ j+ 1 ] = arr[ j+ 1 ] , arr[ j] swapped = True if not swapped: break return arr
核心优化 :提前终止机制嵌入式适配 :STM32内存受限场景下的原地排序测试用例 :
assert bubble_sort( [ 5 , 3 , 8 , 1 ] ) == [ 1 , 3 , 5 , 8 ]
assert bubble_sort( [ - 5 , 0 , 3 ] ) == [ - 5 , 0 , 3 ]
2. 插入排序(Insertion Sort)
def insertion_sort ( arr) : for i in range ( 1 , len ( arr) ) : key = arr[ i] j = i - 1 while j >= 0 and key < arr[ j] : arr[ j + 1 ] = arr[ j] j -= 1 arr[ j + 1 ] = keyreturn arr
性能优化 :二分查找插入位置项目关联 :LVGL库移植中的触摸坐标排序边界处理 :j >=0
防止数组越界
3. 选择排序(Selection Sort)
def selection_sort ( arr) : """选择排序实现(原地排序,内存敏感场景优选)Args:arr (list): 待排序的列表Returns:list: 排序后的列表Example:>>> selection_sort([64, 25, 12, 22, 11])[11, 12, 22, 25, 64]""" n = len ( arr) for i in range ( n) : min_idx = i for j in range ( i+ 1 , n) : if arr[ j] < arr[ min_idx] : min_idx = jarr[ i] , arr[ min_idx] = arr[ min_idx] , arr[ i] return arr
核心特性 : 原地排序:空间复杂度O(1),适合嵌入式系统 时间复杂度:O(n²)(无论最好/最坏情况) 非稳定排序:可能改变相等元素的相对顺序 交换次数最少:只有n次交换(适合写操作昂贵的场景)
4. 快速排序(Quick Sort)
def quick_sort ( arr) : if len ( arr) <= 1 : return arrpivot = arr[ 0 ] for i in range ( 1 , len ( arr) ) : key = arr[ i] j = i - 1 while j >= 0 and key < arr[ j] : arr[ j + 1 ] = arr[ j] j -= 1 arr[ j + 1 ] = keyreturn arr
三数取中改进 :避免最坏O(n²)情况服务器测试 :网卡打流测试数据的快速切分
5. 归并排序(Merge Sort)
def merge_sort ( arr) : """归并排序实现(分治策略,稳定排序)Args:arr (list): 待排序的列表Returns:list: 排序后的列表Example:>>> merge_sort([3, 6, 8, 10, 1, 2, 1])[1, 1, 2, 3, 6, 8, 10]""" if len ( arr) <= 1 : return arrmid = len ( arr) // 2 left_half = merge_sort( arr[ : mid] ) right_half = merge_sort( arr[ mid: ] ) merged = [ ] i = j = 0 while i < len ( left_half) and j < len ( right_half) : if left_half[ i] <= right_half[ j] : merged. append( left_half[ i] ) i += 1 else : merged. append( right_half[ j] ) j += 1 merged. extend( left_half[ i: ] ) merged. extend( right_half[ j: ] ) return merged
核心特性 : 稳定排序:保持相等元素的相对顺序 分治策略:递归分解+有序合并 链表适配:特别适合链表结构排序(无需额外空间)
6. 堆排序(Heap Sort)
def _heapify ( arr, n, i) : """维护堆结构""" largest = ileft = 2 * i + 1 right = 2 * i + 2 if left < n and arr[ left] > arr[ largest] : largest = leftif right < n and arr[ right] > arr[ largest] : largest = rightif largest != i: arr[ i] , arr[ largest] = arr[ largest] , arr[ i] _heapify( arr, n, largest) def heap_sort ( arr) : n = len ( arr) for i in range ( n// 2 - 1 , - 1 , - 1 ) : _heapify( arr, n, i) for i in range ( n- 1 , 0 , - 1 ) : arr[ i] , arr[ 0 ] = arr[ 0 ] , arr[ i] _heapify( arr, i, 0 ) return arr
核心特性 : 原地排序:空间复杂度O(1),适合嵌入式系统 时间复杂度:O(n log n)(无论最好/最坏情况) 非稳定排序:可能改变相等元素的相对顺序 二叉堆结构:完全二叉树的数组表示
7. 计数排序(Counting Sort)
def counting_sort ( arr) : """计数排序实现(非比较型排序,适用于小范围整数)Args:arr (list): 待排序的整数列表Returns:list: 排序后的列表Example:>>> counting_sort([4, 2, 2, 8, 3, 3, 1])[1, 2, 2, 3, 3, 4, 8]""" if not arr: return [ ] min_val, max_val = min ( arr) , max ( arr) range_size = max_val - min_val + 1 count = [ 0 ] * range_sizefor num in arr: count[ num - min_val] += 1 sorted_arr = [ ] for i in range ( range_size) : sorted_arr. extend( [ i + min_val] * count[ i] ) return sorted_arr
核心特性 : 非比较型排序:突破O(n log n)下限 时间复杂度:O(n+k),k为数值范围 空间复杂度:O(k),需要额外存储空间 稳定性:通过后进先出策略保持稳定
算法选择决策树
数据规模?
├─ 小规模(n<1000) → 插入排序
├─ 大规模 → 分治类
│ ├─ 需稳定 → 归并排序d
│ └─ 不需稳定 → 快速排序
└─ 特殊数据├─ 整数且集中 → 计数排序└─ 硬件相关 → 堆排序