2016-09-10 4 views
1

Ich habe Probleme, die In-Place-Version von merge sort zu verstehen.Understanding 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; 
} 

Was ist der Zweck 0 und items.length an der Vorderseite des params der Zugabe? Ich verstehe nicht, was items.splice.apply tut, aber von der Konsole Protokollierung einige Beispiele, es sieht aus wie es nur entfernt, was auf params unverschoben wurde. Was ist der Grund dafür?

+1

Das ist nicht an Ort und Stelle. – user2357112

+0

@ user2357112 Der Code, von dem ich das habe, ist https://www.nczonline.net/blog/2012/10/02/computer-science-and-javascript-merge-sort/. Es besagt, dass dies eine Implementierung vor Ort ist. – AlanH

+0

... dieser Blog-Beitrag erklärt * genau * was das 'unshift' und' splice' Zeug macht. – user2357112

Antwort

0

TLDR: ersetzt den Inhalt von items durch die sortierte Version.


Array.prototype.splice hat the following signature:

array.splice(start, deleteCount[, item1[, item2[, ...]]]) 

Es entfernt deleteCount Elemente aus dem Index beginnend start und ersetzt sie mit den dafür vorgesehenen Gegenstände.

items.splice.apply(items, params) führt items.splice(...) mit den Parametern aus params aus. Nach params.unshift(0, items.length) ist params

[0, items.length, sortedItem1, sortedItem2, ...] 

so dass Anruf items.splice(0, items.length, sortedItem1, sortedItem2, ...) ausführt, Löschen items.length Elemente aus Index begonnen 0 (so dass alle von ihnen) und sie mit den Einzelteilen in sortierter Reihenfolge zu ersetzen.

+0

können Sie erklären, warum es nicht an Ort und Stelle ist? Ich habe deinen Kommentar nicht ganz verstanden. – AlanH

+0

@AlanH: Es verwendet eine erhebliche Menge an Hilfsspeicher für 'result',' slice' und 'concat'. – user2357112