2016-11-14 3 views
-1

내 매개 변수에 대한 배열만을 사용하여 mergesort를 구현해야합니다. 나는 그것을 잘게 쪼개서 재조합하는 것을 볼 수 있지만 그렇게하는 동안 그것을 실제로 분류하지는 않습니다. 나는 그것이 내가 어디에서/어떻게 내가 사물을 부르고 있는지와 관련이 있다고 확신한다. 올바른 데이터를 집어 내지 못하는 부분을 지적하여 문제를 해결할 수 있습니까?Mergesort 실제로 정렬하지 않습니다

public static void mergesort(Comparable[] a) { 
    a = mergeSort(a); 
} 

public static Comparable[] mergeSort(Comparable[] a) { 
    Comparable[] first, second; 
    int length1 = a.length/2; 
    int length2 = a.length - length1; 

    first = Arrays.copyOfRange(a, 0, length1); 
    second = Arrays.copyOfRange(a, length1, a.length); 

    if(length1 > 0 && length2 > 0) { 
     first = mergeSort(first); 
     System.out.print("First: "); 
     show(first); 
     second = mergeSort(second); 
     System.out.print("Second: "); 
     show(second); 
     a = merge(first, second); 
     System.out.print("\nAfter: "); 
     show(a); 
    } 
    return a; 
} 

public static Comparable[] merge(Comparable[] a, Comparable[] b) { 
    Comparable[] temp = new Comparable[a.length + b.length]; 
    int aFirst = 0, aLast = a.length - 1; 
    int bFirst = 0, bLast = b.length - 1; 
    int index = aFirst; 

    while(aFirst <= aLast && bFirst <= bLast) { 
     if(a[aFirst].compareTo(b[bFirst]) < 0) { 
      temp[index] = a[aFirst++]; 
     } else { 
      temp[index] = b[bFirst++]; 
     } 
     index++; 
    } 

    while(aFirst <= aLast) { 
     temp[index] = a[aFirst++]; 
     index++; 
    } 

    while(bFirst <= bLast) { 
      temp[index] = b[bFirst++]; 
      index++; 
    } 
    return temp; 
} 

수정 사항 : 여기에 내가 사용하는 기본 방법의 스 니펫이 있습니다. 변경할 수 없습니다.

String[] b = {"S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "E"}; 
    mergesort(b); 
    assert isSorted(b); 
    show(b); 
+1

저를 신뢰하십시오. 병합 정렬은 실제로 정렬합니다. – xenteros

+0

확실하지만이 구현은 실제로 정렬되지 않습니다. 그게 내가 묻고있는거야. – Kendra

+2

mergesort는 무효이므로 항상 결과를 – Turo

답변

1

이 두 전화 :

mergesort(first); 
mergesort(second); 

종류의 배열 first 새로운 배열에 second,하지만 당신은 그 분류 배열을 무시합니다. 코드는해야한다 : 이러한 방법 중 하나를 입력하고 수익을 정렬하려고 :

first = mergeSort(first); 
second = mergesort(second); 

실제 문제는 비슷한 이름 (mergesortmergeSort)하지만 매우 다른 의도 된 행동 두 가지 방법을 가지고있다 다른 하나는 정렬 된 결과를 반환하지 않으므로 입력을 수정해야합니다.

두 가지 방법 모두 장점이 있습니다. 하지만 현재의 코드는 이러한 것들을 접근법에 혼합합니다.


무엇 현재 코드를 다시 인수 배열에 정렬 된 요소 저장됩니다 누락되었습니다

public static void mergesort(Comparable[] a) { 
    Comparable[] sorted = mergeSort(a); 
    System.arrayCopy(sorted, 0, a, 0, a.length); 
} 

과 : 당신의 도우미 방법이없는 경우 클래스 외부에서 호출 할 그들에게이 같은 private을 :

private static Comparable[] mergeSort(Comparable[] a) { 
    ... 
} 

private static Comparable[] merge(Comparable[] a, Comparable[] b) { 
    ... 
} 

으로도 변경하십시오.

항상 궁극적 인 목표는 코드를 최대한 읽기 쉽도록 만들고 독자의 의도를 코드에 표시하는 것입니다.

+0

에 던집니다. 두 번째 방법 인 mergeSort가 재귀. 그게 내가 잘못하고있는 일일거야. 입력을 수정하고 싶습니다. – Kendra