簡體   English   中英

它是就地排序嗎?

[英]Is it a in-place sort?

我已經閱讀了Nicholas C. Zakas發布的博客(原始鏈接: 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));
}

是的,兩種算法都以新的不同數組對數據進行排序。 這意味着需要O(n)額外的空間。

唯一的區別是所謂的“就地排序”然后清空了原始數組,並用排序后的數據填充了該數組。 是否使其在適當位置取決於in-place的定義。

就地算法是使用具有少量額外存儲空間的數據結構轉換輸入的算法。

就地可以具有稍微不同的含義。 在最嚴格的形式下,該算法只能有恆定數量的額外空間,盡管有時允許o(n)任何內容。

因此通常不將其視為就地,因為額外的空間復雜度大於o(n)

如果要使用O(n log(n))時間復雜度和O(1)額外空間復雜度的就地排序算法,則可以使用heapsort 缺點是,與mergesort不同,heapsort是不穩定的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM