了解就地合并

时间:2016-09-10 03:11:37

标签: javascript mergesort

我很难理解合并排序的就地版本。

function merge(left, right){
    var result  = [],
        il      = 0,
        ir      = 0;

    while (il < left.length &#038;&#038; 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;
}

0items.length添加到参数前面的目的是什么?我不明白items.splice.apply正在做什么,但是通过控制台记录一些示例,它看起来只是删除了未迁移到params的内容。这是什么原因?

1 个答案:

答案 0 :(得分:0)

TLDR:它用排序的版本替换items的内容。

Array.prototype.splicethe 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项(所有这些项),并将它们替换为排序顺序的项。