algorithm - 快速排序的内存复杂度

标签 algorithm sorting data-structures complexity-theory quicksort

Quicksort 的空间复杂度是listed as O(登录)

但是 - Quicksort 可以在不使用任何额外内存的情况下进行处理: 在每次迭代中,在分区过程中, 这些条目最终被交换到 基于所使用的枢轴的左右分区。 这种递归交换并因此形成分区 可以在列表本身上完成而无需 在递归调用干扰的一级分区 并且不会在不同级别的调用干扰中进行快速排序。

Quicksort 中的额外内存有什么用?

TIA。

//============================

编辑:

同意评论/答案中的堆栈空间——错过了。

还是,

预期情况 中,Quicksort 的执行时间为 O(nlogn) -- 通过在每个递归级别形成(几乎)大小相等的分区。

使用的堆栈空间是二叉树,在最佳情况下是满树,高度为 log n。 这棵树上的每个节点都是一个递归调用,堆栈空间 在这种情况下是 n 的顺序——而不是 log n。这棵树上有 O(n) 个节点。向左和向右的递归调用 分区是同时进行的——调用树在某个执行点已满。

所以 - 平均情况空间复杂度应该是 O(n)-- 而不是 O(logn) (?)

这也与归并排序的空间复杂度矛盾。 合并排序空间复杂度列为 O(n) 并且处理类似。

最佳答案

Quicksort 通常使用 O(log n) 额外内存,存储在堆栈上。它不是 O(n),因为二叉树在内存中永远不会显式,我们只是对其进行后序遍历(即:树中只有一个路径曾经存储在给定的位置时间)。

Mergesort 被列为 O(n) 因为我们通常将合并的结果复制到一个新数组中。根据维基百科,就地排序是可能的,但将时间复杂度增加到 O(n log2 n)。它仍然会使用 O(log n) 进行递归。

关于algorithm - 快速排序的内存复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738135/

相关文章:

algorithm - 具有多个分支的等待队列

linux - Linux 中的稳定排序

c# - 排序不适用于年份 "2013"

algorithm - 基数树节点

c++ - 如何在 Visual C++ 2008 中就地构建转换为数组编译的结构?

c++ - Endianness 和 C API 的 : Specifically OpenSSL

algorithm - 寻找具有最大最小度数的生成树

algorithm - 如何删除最小-最大堆上的第 k 个元素?

algorithm - 随机数发生器测试

algorithm - 高度优化的算法对仅包含 0s n 1s 的数组进行排序