cheny:
私はアルゴリズム、第4版の第2章の問題2.2.10を読んだときの問題は、私を困惑しました。この本は、高速マージアルゴリズムの結果は不安定であり、私は、感謝をthat.Help私の証拠を見つけることができないと言います!
public static void sort(Comparable[] a, int lo, int hi){
if hi <= lo {
return;
}
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid+1, hi);
merge(a, lo, mid, hi);
}
// Why is the result of this sort not stable
private static void merge(Comparable[] a, int lo, int mid, int hi) {
for (int i = lo; i <= mid; i++)
aux[i] = a[i];
for (int j = mid+1; j <= hi; j++)
aux[j] = a[hi-j+mid+1];
int i = lo, j = hi;
for (int k = lo; k <= hi; k++)
if (less(aux[j], aux[i])) a[k] = aux[j--];
else a[k] = aux[i++];
}
私はそれに得ることができるか、結果が不安定であることを見つけることができませんか?
chqrlie:
アルゴリズムの不安定性を証明するために、単一の反例で十分である:4つの要素のアレイソートするために取られるステップ考えることができA B C D
に対して等しい比較less
述語。
sort(a, 0, 3)
2個のサブアレイで再帰的な処理:sort(a, 0, 1)
これは再び再帰sort(a, 0, 0)
これはすぐに戻りますsort(a, 1, 1)
これはすぐに戻りますmerge(a, 0, 0, 1)
の順序を変更しませんA B
sort(a, 2, 3)
その上に再帰sort(a, 2, 2)
これはすぐに戻りますsort(a, 3, 3)
これはすぐに戻りますmerge(a, 2, 2, 3)
の順序を変更しませんC D
merge(a, 0, 1, 3)
コピー項目A B C D
にt
順にA B D C
、マージループ内のすべての比較が偽と評価し、従ってにコピーバック要素は、a
からコピー同じ順序であるt[i++]
:A B D C
、ソートアルゴリズムの不安定性を証明、すなわち:要素の相対的な順序ことは、等しいと保存されません。