2016-09-10 2 views
1

병합 정렬의 현재 위치 버전을 이해하는 데 어려움을 겪고 있습니다.현재 위치 병합 이해

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; 
} 

PARAMS의 전면에 0items.length를 추가하는 목적은 무엇인가? items.splice.apply이 무슨 일을하는지 이해하지 못 하겠지만, 콘솔에서 몇 가지 예제를 로깅하면으로 변경되지 않은 부분 만 제거되는 것처럼 보입니다. 이것에 대한 이유는 무엇입니까?

+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.splicethe following signature 있습니다

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

이 인덱스 start부터 deleteCount 항목을 제거하고 제공 항목을 대체합니다.

items.splice.apply(items, params)params에서 가져온 매개 변수로 items.splice(...)을 실행합니다. params.unshift(0, items.length)params

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

가되도록 호출 (그래서 그들 모두) 인덱스 0부터 시작하여 정렬 된 순서의 항목으로 대체 items.length 항목을 삭제 items.splice(0, items.length, sortedItem1, sortedItem2, ...) 실행된다.

+0

당신은 그것이 제자리에없는 이유를 설명 할 수 있습니까? 나는 당신의 코멘트를 얻지 못했습니다. – AlanH

+0

@AlanH :'result','slice','concat'에 상당한 양의 보조 기억 장치를 사용합니다. – user2357112