数组上的Mergesort的空间复杂度为O(n),而链表上的mergesort的空间复杂度为O(log(n)),记录为here
我相信我了解数组的情况,因为在合并两个子数组时我们需要辅助存储。但是,链接列表合并排序是不是只合并了两个子链接列表?我认为这会产生空间复杂度O(1)来创建一个新头。
就地合并(无辅助存储):
public Node merge(Node a, Node b) {
Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
while(a !=null && b!= null) {
if(a.info <= b.info) { curr.next = a; a = a.next; }
else { curr.next = b; b = b.next; }
curr = curr.next;
}
curr.next = (a == null) ? b : a;
return dummyHead.next;
}
解释会很棒。
答案 0 :(得分:25)
mergesort算法是递归的,因此对于数组和链表大小写,它需要O(log n)堆栈空间。但是数组的情况下还分配了一个额外的O(n)空间,它占据了堆栈所需的O(log n)空间。所以数组版本是O(n),链表版本是O(log n)。
答案 1 :(得分:20)
Mergesort是一种递归算法。每个递归步骤都会在堆栈上放置另一个帧。对64个项目进行排序将比32个项目多一个递归步骤,实际上当空间要求被称为O(log(n))时,它会引用堆栈的大小。