You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归插入排序算法的空间复杂度为何是O(n)而非O(1)?

递归插入排序的空间复杂度为什么是O(n)?

递归插入排序实现代码

void recursiveInsertionSort(vector<int> &arr, int n) {
    if (n <= 1)
        return;
    recursiveInsertionSort(arr, n - 1);
    int val = arr[n - 1], j = n - 2;
    for (j = n - 2; j >= 0 && arr[j] > val; --j)
        arr[j + 1] = arr[j];
    arr[j + 1] = val;
}

问题描述

我原本认为该算法的空间复杂度为常数O(1),因为数组是按引用传递的,但被告知实际是O(n),想知道其中的原因。


你忽略了递归调用栈的空间开销。

虽然数组是按引用传递,没有额外开辟新的数组存储空间,但递归函数每执行一次调用,都会在程序的调用栈上创建一个栈帧——这个栈帧会保存当前函数的参数(比如n的当前值)、局部变量(val、j)以及返回地址等信息。

对于这个递归插入排序,递归调用的深度是n:从recursiveInsertionSort(arr, n)开始,依次调用到recursiveInsertionSort(arr, n-1)、recursiveInsertionSort(arr, n-2)……直到recursiveInsertionSort(arr, 1),此时调用栈上会同时存在n个栈帧。每个栈帧的空间是常数级,但总空间开销累加后就是O(n),这就是整个算法空间复杂度为O(n)的原因。

如果是迭代版本的插入排序,因为不需要递归调用栈的开销,空间复杂度才是O(1)。

内容的提问来源于stack exchange,提问作者user21661616

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:22:03