2013-08-01 2 views
2

병합 정렬 방법 내에서 다른 위치에서 테스트했을 때 제대로 작동한다고 생각하는 병합 기능이 있습니다. 그러나 전체적으로 병합 정렬을 시도 할 때 숫자가 제대로 정렬되지 않습니다. 편집 : 추가 병합병합 정렬이 제대로 작동하지 않습니다.

코드 : 항상가이 개 범위를 병합 할 대상으로 A[0] 사용

void mergeSort(int A[], int p, int q) 
// PRE: p >= 0; q >= 0; A[p..q] is initialized 
// POST: A[p..q] is sorted in ascending order 
{ 
    int i;          // counter used to initialize L and R 
    int j; 
    int m;          // midpoint of A 
    int L[100];        // lower half of A 
    int R[100];        // upper half of A 

    if (p < q)        // if list contains more than one value 
    { 
     m = (p + q)/2;      // find midpoint 

     j = 0; 

     for (i = p; i <= m; i++)    // initialize lower half of array 
     { 
      L[j] = A[i]; 
      j++; 
     } 

     j = 0; 

     for (i = m + 1; i <= q; i++)   // initialize upper half of array 
     { 
      R[j] = A[i]; 
      j++; 
     } 

     mergeSort(A, p, m);     // call mergeSort for lower half of array 

     mergeSort(A, m + 1, q);    // call mergeSort for upper half of array 

     merge(L, R, m - p + 1, q - m, A); // merge both sides 
    } 
} 

void merge(int L[], int R[], int l_size, int r_size, int A[]) 
// PRE: l_size > 0; r_size > 0; L[0..l_size-1] is in ascending order; 
//  R[0..r_size-1] is in ascending order; A is allocated to l_size + r_size 
// POST: A[0..l_size+r_size-1] contains all elements of L[0..l_size-1] and   
     R[0..r_size-1] 
{ 
    int i;         // counter used to fill A at end of algorithm 
    int l_ctr;        // counter used to traverse L 
    int r_ctr;        // counter used to traverse R 
    int a_ctr;        // counter used to traverse A 

    l_ctr = 0; 
    r_ctr = 0;        // set all counters equal to zero 
    a_ctr = 0; 

    while (l_ctr < l_size && r_ctr < r_size) // loop runs until reaching end of a list 
    { 
     if (L[l_ctr] < R[r_ctr])   // if lowest remain ing value in L is 
     {          // lower than lowest remaining value in R; 
      A[a_ctr] = L[l_ctr];    // set next index of A to L[l_ctr] 
      l_ctr++;       // increment l_ctr by one 
     } 
     else          // else do the same for r_ctr 
     { 
      A[a_ctr] = R[r_ctr]; 
      r_ctr++; 
     } 
     a_ctr++;         // increment a_ctr by one 
    } 

    if (l_ctr < l_size)       // if all of L has not been seen yet 
    { 
     for (i = l_ctr; i < l_size; i++)   // loop sets remaining values in L 
     {           // to the last values of A 
      A[a_ctr] = L[i]; 
      a_ctr++; 
     } 
    } 
    else           // else do the same for R 
    { 
     for (i = r_ctr; i < r_size; i++) 
     { 
      A[a_ctr] = R[i]; 
      a_ctr++; 
     } 
    } 
} 
+2

당신은 너무 친절 당신의 들여 쓰기'처럼 merge' 무엇 – Borgleader

+1

을 :)하십시오 해결하기 위해시겠습니까? – greatwolf

+0

C++에는 병합 기능이 내장되어 있으며 내장 종류 중 병합 정렬도 가능합니다 – aaronman

답변

0

병합 단계. [p..m][m+1..q]에 설명 된 범위를 A[p..q]으로 되돌리려면 최소한 두 가지 간단한 수정 사항이 있습니다.

  • merge의 마지막 매개 변수로 전달할 A+p (또는 사용 &A[p], 그들은 같은이야).
  • mergep을 추가 매개 변수로 전달하고이를 사용하여 a_ctr을 초기화합니다.

하나를 선택하여 테스트하십시오.

편집 :

내가 로컬 코드를 테스트하고 mergeSort는 단지 당신이 m을 계산 선 아래까지 이동해야하는 재귀 호출을 참조

. 임시 배열에 복사하는 다음 줄은 병합 프로세스에 속하며 재귀 호출 후에 있어야합니다.

Working example at ideone.com

+0

나는 모든 것을 시도했지만 여전히 동일한 결과를 받았습니다. –

+0

@NeilMunroe : 코드를 찾아서 수정했습니다. 내 편집을 참조하십시오. – Blastfurnace

관련 문제