2016-12-05 2 views
0

정렬 알고리즘을 배우고 있습니다. 다음 링크에있는 프로그램을 살펴 보았습니다. 간단히하기 위해 링크와 프로그램 자체를 모두 첨부하고 있습니다.이 병합 정렬 프로그램이 어떻게 작동하고 있습니까?

public class Mergesort { 
private int[] numbers; 
private int[] helper; 
private int number; 

public void sort(int[] values) { 
    this.numbers = values; 
    number = values.length; 
    this.helper = new int[number]; 
    mergesort(0, number - 1); 
} 

private void mergesort(int low, int high) { 
    if (low < high) { 
    int middle = low + (high - low)/2; 
    mergesort(low, middle); 
    mergesort(middle + 1, high); 
    merge(low, middle, high); 
    } 
} 

private void merge(int low, int middle, int high) { 
    for (int i = low; i <= high; i++) { 
     helper[i] = numbers[i]; 
    } 
    int i = low; 
    int j = middle + 1; 
    int k = low; 
    while (i <= middle && j <= high) { 
     if (helper[i] <= helper[j]) { 
      numbers[k] = helper[i]; 
      i++; 
     } else { 
      numbers[k] = helper[j]; 
      j++; 
     } 
     k++; 
    } 
    while (i <= middle) { 
     numbers[k] = helper[i]; 
     k++; 
     i++; 
    } 
} 

}

나는 병합 방법이 지난 동안은 (내가 < = 중간)에 포함되어 왜 어떤 단서를 받고 있지 않다. 한편 (j < = high) 동안의 수단도 있었지만이 조건은 무시되었습니다. 이 프로그램을 가지고있는 링크는 http://www.vogella.com/tutorials/JavaAlgorithmsMergesort/article.html

죄송합니다. 누군가가 나에게 설명하기를 바랍니다.

+0

작동합니까? 책상 점검 또는 디버깅을 시도 했습니까? – GurV

+0

예, 예상되는 출력을 내고 있습니다. –

답변

2

단서는 참조 문서에서 실제로 : 상반기에 번호가 하반기에 숫자보다 모두 큰 경우

  // Copy the rest of the left side of the array into the target array 
      while (i <= middle) { 
        numbers[k] = helper[i]; 
        k++; 
        i++; 
      } 

이 경우를 생각해 보자. 그러면 첫 번째 while 사이클에서는 j 만 증가하므로 전반부의 숫자는 복사하지 않습니다. 두 번째 while주기는 나머지 절반을 첫 번째 절반부터 복사합니다.

실제로 남은 숫자를 후반부에서 복사 할 필요가없는 이유는 좋은 질문입니다. 나는 너에게 맡길거야. :)

+0

예, 더 나은 질문은 우리가 후반부의 숫자를 복사 할 필요가없는 이유입니다. 그리고 나는 나의 대답을 가지고있다. 고마워요 :) –

+0

@ S.kalya - 병합 전에 임시 배열에 대한 복사본이 완료되어 병합이 임시 배열에서 다시 원래 배열로 병합되기 때문에 후반의 숫자는 필요하지 않습니다. 병합 정렬이 재귀 수준에 따라 원본 버퍼와 임시 버퍼 사이의 병합 정렬이보다 효율적이고 교대로 이루어진 경우 복사 단계가 없으므로 병합은 첫 번째 또는 두 번째 절반의 나머지 숫자를 복사해야합니다. 실행 크기 == 1이고 원본에서 임시로 병합하는 특정 경우에는 1 요소를 복사해야합니다. – rcgldr