병합 정렬이 수행해야하는 작업을 알고 있으며 지금은 다소 시각화 할 수 있습니다. 한 요소의 배열이 이미 정렬되어 있기 때문에 하나의 요소 만 배열에 남아있을 때까지 반복적으로 분할하면 각 재귀에 필요한 작업량이 줄어들고 이미 정렬 된 배열을 다른 배열에 추가하는 것보다 정상 반복으로 정렬하십시오.병합 정렬 알고리즘이 제대로 병합되지 않습니다.
저는 현재 두 가지 주요 문제가 있습니다. 하나, 분할 (단순한 것이지만 고정되지 않으면 모든 것을 버릴 것입니다.), 저 -> 중반 (+/- 1) 및 중간 -> 고갈로 갈라 놓으면 문제가 생깁니다. 기본 사례가 제대로 테스트되지 않고 조기에 반환되어 정렬되지 않은 배열이 발생합니다. 예를 들어, 다른 포럼의 답장을 인용하면 "5 명이 중간, 9 명이 좋고 0 명이 적다면 0에서 5로 오른쪽으로 나눠야하고 6에서 9로 왼쪽으로 나눠야합니다. 또는 오른쪽으로 0에서 4, 왼쪽에서 5로 9입니다. 문제는 6에서 9로 다시 나누면 반올림으로 인해 중간이 7이므로 오른쪽에서 6에서 7까지만 사용한다는 것입니다. 7 - 6이 1이고 2보다 작 으면 2보다 작을 경우 실패하고 2는 잠재적으로 분류되지 않은 요소가됩니다. "
이제는 두 가지 중 어느 하나라도 중간에 +/-를 추가하면 잘 작동하지 않는 홀수가 낮은 숫자가됩니다. 이 문제를 어떻게 해결할 수 있습니까?
둘째, 병합과 관련하여 B'sand C의 배열 범위가 적절한 지 여부를 올바르게 (그리고 효율적으로) 확인하는 방법은 무엇입니까? PosB와 PosC가 경계에 있는지 여부를 확인하기 위해 또 다른 조건문이 필요합니까? 그렇지 않은 경우 어떻게 다른 배열의 왼쪽에있는 배열을 최종 배열에 적절하게 (그리고 깔끔하게) 추가 할 수 있습니까?
미리 감사드립니다. 이것은 시각적 인 기본에 있어야하지만, 지금은 의사 코드가 올바른 구문을 강조하기보다는 이러한 문제에 접근하는 가장 좋은 방법 인 것으로 보입니다.
당신이 당신의 결과 (6,7,8)의 3 개 요소가 6-8에서 위치를 액세스 할 때 :
A[] = { 28, 39, 48, 27, 9, 88, 11, 4, 7} ' Global variable, disregard bad programming practices
Function Split(int low, int hi){ ' Adding brackets because not only am I used to java, it should help readability
if (hi - low) < 2 then
return array of elements from [low, hi]
end if
mid = (hi + low)/2
B[] = split(low, mid-1) ' Either I do mid-1 or mid+1, the results seem the same
C[] = split(mid, hi) ' Same problems as above
D[] = Merge(B[], C[])
return D[]
End Function
Function Merge(B[], C[]) ' I use two arrays because I figured it'd be the easiest to work with.
int PosB = 0, PosC = 0, PosMax = (b.length + c.length) -1 ' PosB and PosC keep track of the positions in the cells of B and C respectively.
'PosMax keeps track of the max cell that E[] (declared below) should have as well as the max number for the for loop
E[num] ' Declare and iniatialize an array that is supposed to hold the combined values of B and C, sorted.
for i = 0 to num
if PosC >= c.length or B[PosB] < C[PosC] ' Checks if C[] already has added everything it has to E[] and if so, proceeds to add the
' supposedly already sorted array B[]'s elements to E[]. Emphasis on "supposedly". A problem here is it does not check for if PosB
' is out of bounds, which is a huge problem with primitive arrays. Also checks if the current element in C is greater than the
' current element in B, and if so, add the element in B and increment.
E[i] = B[PosB]
PosB += 1 ' Does not check whether or not PosB is at the end, gotta figure a way to check
Else
E[i] = C[PosC]
PosC += 1
End If
Next
End Function
러버 덕 덕분에 많은 편집이 필요했습니다. 고맙습니다. –