选择排序执行时长异常:为何func2比func1快10倍以上?
为什么递归版"选择排序"(func2)比迭代版(func1)快这么多?
测试结果没有错误,但你得先搞清楚:func2根本不是标准选择排序的实现思路,它的性能优势来自于Python底层的优化,而非算法本身的效率提升。
两者的核心差异分析
func1:标准迭代选择排序
完全用Python原生循环实现:内层循环逐个比较元素找最小值索引,最后做一次交换。整个过程的核心逻辑(遍历比较)都是Python级别的for循环,而Python的循环本身开销很大——每次循环都要做解释器层面的操作,对于10000长度的列表,内层循环要执行约5000万次((10000*9999)/2),纯Python循环的累计开销会非常大。func2:依赖内置函数的递归实现
它的核心操作min(arr[0:n])和arr.remove(m)都是Python内置的、用C语言实现的方法:min()找最小值的过程是在C层面完成的,比Python循环快几十倍;remove()虽然需要遍历列表找第一个匹配元素并删除(时间复杂度O(n)),但同样是C实现,速度远快于Python写的循环。
哪怕理论上func2的时间复杂度也是O(n²)(每次递归调用要做O(n)的min和remove),但因为核心操作都是C级别的,实际运行效率碾压纯Python循环的func1。
额外注意点
- 递归深度问题:Python默认递归深度限制是1000左右,你测试的列表长度是10000,正常情况下会触发
RecursionError,推测你测试时应该修改了递归限制(比如sys.setrecursionlimit(10000+10))。 - 功能一致性:func2的
remove(m)只会删除第一个出现的最小值,和标准选择排序的行为一致,但它是通过删除+追加的方式调整数组,而非原地交换,本质上是一种"选择-移动"的实现,而非标准选择排序的"选择-交换"。
内容的提问来源于stack exchange,提问作者Sage
相关产品推荐
相关产品推荐

