[英]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.