2016-09-10 1 views
1

Я изо всех сил пытаюсь понять версию слияния на месте.Понимание на месте 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; 
} 

Какова цель добавления 0 и items.length к передней части Params? Я не понимаю, что делает items.splice.apply, но из консоли, введя несколько примеров, похоже, что он просто удаляет то, что было смещено на params. Что является причиной этого?

+1

Это не на месте. – user2357112

+0

@ user2357112 Код, который я получил от https://www.nczonline.net/blog/2012/10/02/computer-science-and-javascript-merge-sort/. В нем говорится, что это реализация на месте. – AlanH

+0

... что сообщение в блоге объясняет * точно * что делает 'unshift' и' splice'. – user2357112

ответ

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, ...), удаление items.length элементов, начиная с индекса 0 (так что все из них) и заменить их элементов в отсортированном порядке.

+0

Не могли бы вы объяснить, почему это не на месте? Я не совсем понял ваш комментарий. – AlanH

+0

@AlanH: Он использует существенное количество вспомогательного хранилища для 'result',' slice' и 'concat'. – user2357112

 Смежные вопросы

  • Нет связанных вопросов^_^