1
次のmergeortはデータ構造とアルゴリズム解析(Weiss)です。私が思っているのは、マージステップの最後のfor
ループです。私はtmpArray
をarray
にコピーしなければならないと理解していますが、私たちはrightend
からなぜそれを行うのか分かりません。i
は0
からtmpArray.size
になります。誰か説明してもらえますか?Mergesort:マージ操作の最後のステップは何ですか?
rightPos
の値、部分配列が始まるスポットは、破壊的
rightPos++
の使用を注意してください(内部ループによって変更されたため。したがって、順序で物事をこの方法を行うための主な理由があると思い
public static void mergeSort(Comparable [ ] a)
{
Comparable [ ] tmpArray = new Comparable[ a.length ];
mergesort(a, tmpArray, 0, a.length - 1);
}
public static void mergesort(Comparable [ ] a, Comparable [ ] tmpArray,
int left, int right)
{
if(left < right) {
int center = (left + right)/2;
mergesort(a, tmpArray, left, center);
mergesort(a, tmpArray, center + 1, right);
merge(a, tmpArray, left, center + 1, right);
}
}
public static void merge(Comparable [ ] a, Comparable [ ] tmpArray,
int leftPos, int rightPos, int rightEnd)
{
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int numElements = rightEnd - leftPos + 1;
while(leftPos <= leftEnd && rightPos <= rightEnd)
if(a[ leftPos ].compareTo(a[ rightPos ]) <= 0)
tmpArray[ tmpPos++ ] = a[ leftPos++ ];
else
tmpArray[ tmpPos++ ] = a[ rightPos++ ];
while(leftPos <= leftEnd) // Copy rest of first half
tmpArray[ tmpPos++ ] = a[ leftPos++ ];
while(rightPos <= rightEnd) // Copy rest of right half
tmpArray[ tmpPos++ ] = a[ rightPos++ ];
for(int i = 0; i < numElements; i++, rightEnd--)
a[ rightEnd ] = tmpArray[ rightEnd ]; // Copy tmpArray back
}
'numElements'の代わりに' tmpArray.size'と言うことができますか? – varatis
いいえ、これらの値は異なります。 'tmpArray.size'は、入力配列全体のサイズです(先頭のmergesort呼び出しのサイズがどのようになっているかに注意してください)。 'numElements'は配列のこの特定スライスの要素の数です。 – templatetypedef
Ohh。とった。ありがとう。 – varatis