它是就地排序吗?

时间:2015-12-12 17:07:56

标签: javascript algorithm sorting in-place

我已经阅读了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));
}

1 个答案:

答案 0 :(得分:3)

是的,两种算法都在一个新的不同数组中对数据进行排序。这意味着需要O(n)额外空间。

唯一的区别是所谓的“就地排序”然后清空原始数组并用排序数据填充它。这是否就地生效取决于in-place的定义。

  

就地算法是一种使用a转换输入的算法   具有少量额外存储空间的数据结构。

     

就地可能有不同的含义。以最严格的形式,   但算法只能有一定量的额外空间   有时允许o(n)中的任何内容。

因此,通常不考虑就地,因为额外的空间复杂度超过o(n)

如果您希望使用O(n log(n))时间复杂度和O(1)额外空间复杂度的就地排序算法,则可以使用heapsort。缺点是,与mergesort不同,heapsort不是stable