マージソートのインプレースバージョンを理解するのが難しいです。インプレースマージソートの理解
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;
}
のparamsの前に0
とitems.length
を添加する目的は何ですか?私はitems.splice.apply
が何をしているのか理解できませんが、コンソールにいくつかの例を記録すると、それはちょうどparams
にシフトされていなかったものを削除するようです。これの理由は何ですか?
これはインプレースではありません。 – user2357112
@ user2357112私が取得したコードはhttps://www.nczonline.net/blog/2012/10/02/computer-science-and-javascript-merge-sort/です。これは、インプレース実装であると言われています。 – AlanH
...そのブログ記事は、*正確に*「unshift」と「スプライス」のことを説明しています。 – user2357112