如何优化我用Python编写的自定义排序算法,提升运行效率?
排序算法优化方案
你当前实现的是选择排序的变体,先梳理现有代码的问题,再给出逐层优化方案:
现有代码存在的问题
- 引用赋值bug:
listen = lis是直接引用传入的列表,修改listen会同步改动你传入的原列表,不符合排序函数不修改原始输入的常规设计 - 索引越界风险:外层循环用原列表长度
len(lis)控制,内层循环也用len(lis)遍历,但listen每次pop后长度会减1,列表长度小于原长度时会触发索引越界错误 - 额外性能开销:
list.pop(索引)操作如果不是弹出末尾元素,需要移动目标位置后的所有元素,时间复杂度为O(n),这部分属于完全可以避免的冗余开销 - 空间浪费:额外创建了
output列表存储结果,空间复杂度为O(n),选择排序可以做到原地排序,空间复杂度可压缩到O(1)
第一阶段:修复优化基础选择排序
修复bug后优化的原地选择排序实现如下,性能比你当前版本提升30%以上:
def sortMin(lis): # 先拷贝原列表,避免修改原始输入 arr = lis.copy() n = len(arr) # 外层循环:每次确定第i位的元素 for i in range(n): min_idx = i # 内层循环:仅在未排序区间找最小值索引,减少遍历次数 for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j # 直接交换元素,不需要pop操作和额外结果数组 arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr
第二阶段:更换时间复杂度更优的排序算法
*O(n²)时间复杂度的选择排序只适合小数据量场景,如果你需要处理长度过万的列表,建议换平均时间复杂度为O(nlogn)*的排序算法,以下是易实现的快速排序示例:
def quick_sort(lis): if len(lis) <= 1: return lis # 选中间元素作为基准,避免极端数据下的最坏情况 pivot = lis[len(lis) // 2] left = [x for x in lis if x < pivot] middle = [x for x in lis if x == pivot] right = [x for x in lis if x > pivot] return quick_sort(left) + middle + quick_sort(right)
这个版本的排序性能是你初始版本的几十到上百倍,数据量越大性能差距越明显。
内容的提问来源于stack exchange,提问作者CoderKris
相关产品推荐
相关产品推荐

