我正在努力理解就地版本的合併排序。瞭解就地合併排序
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));
}
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));
params.unshift(0, items.length);
items.splice.apply(items, params);
return items;
}
什麼是添加0
和items.length
到PARAMS前面的目的是什麼?我不明白items.splice.apply
正在做什麼,但是從控制檯日誌記錄中看到一些例子,它看起來只是將沒有移動的東西移除到params
。這是什麼原因?
這不是就地。 – user2357112
@ user2357112我從中得到的代碼是https://www.nczonline.net/blog/2012/10/02/computer-science-and-javascript-merge-sort/。它說這是一個原地實施。 – AlanH
......博客文章正好解釋了* unshift和splice東西的作用。 – user2357112