我已经阅读了Nicholas C. Zakas发布的博客(原始链接:Computer science in JavaScript: Merge sort)。有一个问题总是困惑我。
博客解释了JavaScript合并排序的概念,作者给出了两种合并排序解决方案(第一种是非就地,另一种是非原样)。
这是我的问题:我认为解决方案1和解决方案2之间的空间复杂性没有区别。所以应该理解所谓的“就地排序”仅仅是输入和输出是否是在这种情况下,相同的数组,但与额外的空间无关?
代码如下:
解决方案1(非就地排序):
function mergeSort(items) {
// Terminal case: 0 or 1 item arrays don't need sorting
if (items.length < 2) {
return items;
}
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
解决方案2(就地排序):
function mergeSort(items) {
if (items.length < 2) {
return items;
}
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle),
params = merge(mergeSort(left), mergeSort(right));
// Add the arguments to replace everything between 0 and last item in the array
params.unshift(0, items.length);
items.splice.apply(items, params);
return items;
}
两者都使用相同的函数merge
:
function merge(left, right){
var result = [],
il = 0,
ir = 0;
while (il < left.length && ir < right.length) {
if (left[il] < right[ir]) {
result.push(left[il++]);
} else {
result.push(right[ir++]);
}
}
return result.concat(left.slice(il)).concat(right.slice(ir));
}
答案 0 :(得分:3)
是的,两种算法都在一个新的不同数组中对数据进行排序。这意味着需要O(n)
额外空间。
唯一的区别是所谓的“就地排序”然后清空原始数组并用排序数据填充它。这是否就地生效取决于in-place的定义。
就地算法是一种使用a转换输入的算法 具有少量额外存储空间的数据结构。
就地可能有不同的含义。以最严格的形式, 但算法只能有一定量的额外空间 有时允许
o(n)
中的任何内容。
因此,通常不考虑就地,因为额外的空间复杂度超过o(n)
。
如果您希望使用O(n log(n))
时间复杂度和O(1)
额外空间复杂度的就地排序算法,则可以使用heapsort。缺点是,与mergesort不同,heapsort不是stable。