質問は、16:43 から 23:34 http://youtu.be/M814OagXWTI?t=16m43sまでのビデオからのマージ ソートに関するものです。
左/右の並べ替えマージ再帰を終了した後、これらのサブ配列をマージして戻す方法がわかりません。要素が 2 つのサブ配列に分割されている一番下から始めましょう。左側のサブ配列は B として、右側のサブ配列は C として知られています。16:43 頃にマージ関数にジャンプし、配列 B と C を並べ替えます。および 3. マージ ソート関数 (以下のコード) は、基本的に B の要素と C の要素をインデックスを介して比較します。要素 0 から始めて、両方の配列の各要素を比較し、最小のものを配列 A に追加します。基本的に並べ替えられた配列になるまで、要素が由来する配列のインデックスを増やします。
基本的に上記と同じことを行い、元の再帰呼び出しを終了し、3 8 2 9 のマージに進みます。これが私の質問です。コードに矛盾があります。マージされた要素を配列 A に戻しましたが、マージ関数を呼び出して 2 8 と 2 9 をマージすると、配列 B、C、および A が渡されます。次に、配列 B と C を使用して比較を行いますが、要素は並べ替えたいのは A ですよね?それでは、間違ったものを並べ替えているだけではないでしょうか? この部分については、本当に説明が必要です。
擬似コード:
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]
}