奇妙な質問があります: このような数値の配列を注文するスマート/最良の方法はどれですか?
[1,1,2,2,3,3,4,4]
これに
[1,2,3,4,1,2,3,4]
アイデアは、リストの各要素にある種の優先順位を与えるために、リストのバランスを取ることです。言語はphpかもしれませんが、それほど重要ではありません
[1,1,2,2,2,2,3,3]あるとしましょう。同じ数の最初のセットを取り、それを別々の配列に入れます(垂直方向)。
1 1
同じ数の2番目のセットについても同様です。
1 1
2 2 2 2
3 3 3
配列を連結して結果を取得します
[1,2,3][1,2,3][2,3][2]
配列内の各要素を繰り返し処理し、それを 2 番目の配列にコピーします。各要素には、シーケンス番号である 2 番目の並べ替えキーも含まれます。
それでは、入力配列 A を呼び出しましょう。
最初:ソートA
次に: A を反復処理し、各要素を新しい配列 B にコピーします。ここで、各要素には 2 番目の並べ替えキーがあり、それらを key1 および key2 と呼びます。Key1 は A からの値、key2 はシーケンス番号です。
A: 1,1,2,2,3,3,4,4
B: (1,1),(1,2),(2,1),(2,2),(3,1),(3,2),(4,1),(4,2)
ここで、最初に key2 で、次に key1 で順序付けする B の要素の比較関数を作成します。
bool isSmallerThan( x, y )
{
if ( x.key2 < y.key2 ) return true;
if ( x.key2 > y.key2 ) return false;
if ( x.key1 < y.key1 ) return true;
return false;
}
次に、新しい比較関数を使用して B を並べ替えます。
B を反復処理し、すべての key1 を A にコピーして戻します。