Robert Sedwickによるアルゴリズムブックのクイックソートセクションからのテキストに続きます。
配列の左、中央、右から 3 つの要素を選択することで、センチネルをこのスキームに組み込むことができます。3 つの要素を並べ替え、真ん中の 1 つを で交換しa[r-1]
、 で分割アルゴリズムを実行しa[l+1],...,a[r-2]
ます。この改善は、3 つの方法の中央値と呼ばれます。
3 つの方法の中央値は、3 つの方法ですばやく並べ替えるのに役立ちます。
これにより、実際の並べ替えで最悪のケースが発生する可能性がはるかに低くなります。並べ替えに
O(N^2)
時間がかかるようにするには、検査される 3 つの要素のうち 2 つがファイル内の最大または最小の要素に含まれている必要があり、このイベントはほとんどのパーティションで一貫して発生する必要があります。この機能は、パーティション分割の前に検査される 3 つの要素の 1 つによって提供されるため、パーティション分割のためのセンチネル キーが不要になります。
これにより、アルゴリズムの合計平均実行時間が約 5% 短縮されます。
template <class Item> void exch(Item &A, Item &B) { Item t = A; A = B; B = t; } template <class Item> void compexch(Item &A, Item &B) { if (B < A) exch(A, B); } static const int M = 10; template <class Item> void quicksort(Item a[], int l, int r) { if (r-l <= M) return; exch(a[(l+r)/2], a[r-1]); // line 1 compexch(a[l], a[r-1]); // line 2. compexch(a[l], a[r]); // line 3. compexch(a[r-1], a[r]); // line 4. int i = partition(a, l+1, r-1); quicksort(a, l, i-1); quicksort(a, i+1, r); } template <class Item> void hybridsort(Item a[], int l, int r) { quicksort(a, l, r); insertion(a, l, r); }
上記のテキストに関する私の質問、誰でも簡単な例で説明できますか
作者が「最悪の場合、実際の並べ替えで発生する可能性ははるかに低い。並べ替えに N 平方時間かかる場合、検査された 3 つの要素のうち 2 つが最大のものでなければならない」とはどういう意味ですか?
「パーティショニング用のセンチネル キーが不要になる」とはどういう意味ですか?
上記のプログラムでは、上記のコードでコメントされている行 1、2、3、および 4 で何を達成していますか?
お時間をいただきありがとうございます。