私は現在、Java で実装されたときにさまざまなアルゴリズムがどのように動作するかを観察する分析プロジェクトに取り組んでいます。Mergesort アルゴリズムを実装するコードをオンラインから入手したので、このコードをランダムに生成された 10,000 個の整数 (1 から 100,000 の間) の配列に対して実行し、スワップと比較が行われた回数を記録する必要があります。
コードのどの時点で、スワップと比較をカウントする変数をインクリメントするか正確にはわかりません。期待値はどうなりますか?Mergesort の最良、最悪、平均のケースはすべて nlog(n) であるため、スワップと比較の合計は 10,000*(log base 2 of 10,000) approx = 138,000 を期待する必要がありますか?
コードは次のとおりです。元の配列が変更された場合にのみスワップが発生すると推測していますが、比較についてはよくわかりません。
void MergeSort(int low, int high)
// a[low : high] is a global array to be sorted.
// Small(P) is true if there is only one element to
// sort. In this case the list is already sorted.
{
if (low < high) { // If there are more than one element
// Divide P into subproblems.
// Find where to split the set.
int mid = (low + high)/2;
// Solve the subproblems.
MergeSort(low, mid);
MergeSort(mid + 1, high);
// Combine the solutions.
Merge(low, mid, high);
}
}
void Merge(int low, int mid, int high)
// a[low:high] is a global array containing two sorted
// subsets in a[low:mid] and in a[mid+1:high]. The goal
// is to merge these two sets into a single set residing
// in a[low:high]. b[] is an auxiliary global array.
{
int h = low, i = low, j = mid+1, k;
while ((h <= mid) && (j <= high)) {
if (a[h] <= a[j]) { b[i] = a[h]; h++; }
else { b[i] = a[j]; j++; } i++;
}
if (h > mid) for (k=j; k<=high; k++) {
b[i] = a[k]; i++;
}
else for (k=h; k<=mid; k++) {
b[i] = a[k]; i++;
}
for (k=low; k<=high; k++) a[k] = b[k];
}