我很难理解合并排序的就地版本。
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
添加到参数前面的目的是什么?我不明白items.splice.apply
正在做什么,但是通过控制台记录一些示例,它看起来只是删除了未迁移到params
的内容。这是什么原因?
答案 0 :(得分:0)
TLDR:它用排序的版本替换items
的内容。
Array.prototype.splice
有the following signature:
array.splice(start, deleteCount[, item1[, item2[, ...]]])
它会从索引deleteCount
开始删除start
个项目,并将其替换为所提供的项目。
items.splice.apply(items, params)
使用items.splice(...)
中的参数执行params
。在params.unshift(0, items.length)
之后,params
是
[0, items.length, sortedItem1, sortedItem2, ...]
以便调用执行items.splice(0, items.length, sortedItem1, sortedItem2, ...)
,删除从索引0开始的items.length
项(所有这些项),并将它们替换为排序顺序的项。