GCCのqsort
の実装では、中央値3を使用してピボットを選択します。その間、3つの要素はソートネットワークでソートされます。ネットワークの並べ替え - どのネットワークが比較をスキップできますか?
3要素のソートネットワークでは、通常3回の比較が必要です。
if(a[0] > a[1]) swap(a[0], a[1]);
if(a[1] > a[2]) swap(a[1], a[2]);
else goto jump;
if(a[0] > a[1]) swap(a[0], a[1]);
jump:;
似た何かがn = 4...16
(比較の知ら最小最適な数を持っているもの)とネットワークのために行うことができる。しかし、この特定の実装では、最後の比較は、前の比較に応じて、スキップすることができますか?もしそうなら、どのように見えますか?
UPDATE: これまでのところ、私は1つの比較をスキップできます一つの他のネットワークを、発見した:
// sorting network for 5 elements
if (a[0] > a[1]) { SWAP(a[0], a[1]); }
if (a[2] > a[3]) { SWAP(a[2], a[3]); }
if (a[1] > a[3]) { SWAP(a[1], a[3]); }
if (a[2] > a[4]) { SWAP(a[2], a[4]); }
if (a[0] > a[2]) { SWAP(a[0], a[2]); }
if (a[1] > a[4]) { SWAP(a[1], a[4]); }
if (a[1] > a[2]) { SWAP(a[1], a[2]); }
if (a[3] > a[4]) { SWAP(a[3], a[4]); }
else { goto jump; }
if (a[2] > a[3]) { SWAP(a[2], a[3]); }
jump:;
私は12345のすべての順列でこれをテストし、それが正確にそれらのすべてをソートします。最適ソーティングネットワークをともかく
スワップが発生しない場合は、条件比較になる頃には、最終的な比較が冗長になります。おそらく、元のインデックスの第2の配列を使用し、その配列をデータとともに交換することによって、また、(n^2 - n)/ 2の配列を使用して、どの要素がすでに比較されているかを把握できます。要素(一度に2つずつ取得されたもの)は0に初期化され、比較ごとに1に設定されます。 – rcgldr