질문 23시 34분 http://youtu.be/M814OagXWTI?t=16m43s병합 정렬 알고리즘 (병합 배열 부분)
우리는 우리가 왼쪽 종료 한 후이 하위 어레이를 다시 병합하는 방법을 내가 혼란 스러워요에 16시 43분부터 비디오에서 병합 정렬에 관한 것입니다/오른쪽 정렬 병합 재귀. 우리의 원소가 두 개의 서브 배열로 나뉘어 질 때 맨 아래부터 시작할 수 있습니다. 왼쪽 서브 배열은 B로 알고 오른쪽 서브 배열은 C로 알려져 있습니다. 약 16:43에서 우리는 병합 함수로 뛰어 들어가서 배열 B와 C를 정렬합니다. 3. 병합 정렬 함수 (코드 숨김)는 기본적으로 인덱스를 통해 B의 요소와 C를 비교합니다. 요소 0부터 우리는 두 배열의 각 요소를 비교하고 어느 것이 든 가장 작은 배열을 배열 A에 추가합니다. 우리는 기본적으로 정렬 된 배열을 가질 때까지 요소가 제공 한 배열의 인덱스를 늘립니다. 정렬 된 배열이 끝나면 이전에 일시 중지 된 재귀 스택을 다시 크롤링하고 하위 배열의 오른쪽 분할을 계속 진행하기 위해 재귀 호출을 종료합니다. 8 3 2 9
기본적으로 우리는 위와 같은 재귀 호출을 끝내고 합병 3 8 2 9로 진행합니다. 좋아요, 제 질문입니다 : 코드에서 모순이 있습니다. 병합 된 요소를 배열 A에 다시 넣었습니다. 그러나 병합 함수를 호출하여 2 8과 2 9를 병합하면 배열 B, C 및 A가 전달됩니다. 그런 다음 배열 B와 C를 사용하여 비교를 수행하지만 요소 우리는 정렬하고 싶습니다. 그렇지 않습니까? 그렇다면 잘못된 것들을 정렬하는 것만은 아닐까요? 이 부분에 대한 설명이 필요합니다.
의사 코드 :
MergeSort(A[0...n-1]){
if n<=1
return A;
copy A[0...n/2-1] to B[0...n/2-1]
copy A[n/2...n-1] to C[0...n/2-1]
MergeSort(B[0...(n/2)-1)
MergeSort(C[0...(n/2)-1)
Merge(B,C,A)
Merge(B[0...p-1], C[0...q-1], A[0...p+q-1]){
i=0; j=0; k=0
while(i <p and j<q) do{
if B[i] <= C[j] {
A[k]=B[i];
i=i+1;
}
else {
A[k]=C[j];
j=j+1;
}
k=k+1
}
//Copy leftover element
if i==p
A[k...p+q-1]=C[j...q-1]
else
A[k...p+q-1]=B[i...p-1]
}
A는 형식 인수 식별자이므로 MergeSort의 다른 호출에서 다른 것을 의미합니다. –
이것은 내 질문에 답하지 않습니다. – user2644819
2와 9로 나뉘는 재귀 이후에 우리는 부분 배열 9에서 MergeSort (C [0 ... (n/2) -1)를 재귀 적으로 호출하려고하지만 재귀 호출을 종료하고 emerge MergeSort (C [0 ... (n/2) -1)를 제거하고 병합 (B, C, A) 인 다음 명령문으로 진행하십시오. 2와 9의 배열 B와 C를 배열 A에 병합 한 다음 그 재귀 호출을 끝내고 이전의 일시 중지 된 재귀 호출로 되돌아갑니다. – user2644819