どのように証明するか、高速マージソート不安定なアルゴリズムであることを示していますか?

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 Dt順にA B D C、マージループ内のすべての比較が偽と評価し、従ってにコピーバック要素は、aからコピー同じ順序であるt[i++]A B D C、ソートアルゴリズムの不安定性を証明、すなわち:要素の相対的な順序ことは、等しいと保存されません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=227679&siteId=1
おすすめ