3要素ソートのメモ (3element pattern sort)

3要素をパターンでソート.
安定ソートではないことに注意.

久しぶりの記事がこれですよ

// パターン.
constexpr int k_sort_pattern_3[8][3]
{
    {2, 1, 0},  // 000-> 0
    {0, 2, 1},  // 001-> 1
    {1, 0, 2},  // 010-> 2
    {0 ,1, 2},  // 011-> 3
    {2, 1, 0},  // 100-> 4
    {2, 0, 1},  // 101-> 5
    {1, 2, 0},  // 110-> 6
    {0 ,1, 2},  // 111-> 7
};
// 3要素からパターンID計算.
constexpr auto get_sort_pattern_3 = [](const float (&ar)[3])
{
    return ((ar[0] <= ar[1]) ? 1 : 0) + ((ar[1] <= ar[2]) ? 2 : 0) + ((ar[2] <= ar[0]) ? 4 : 0);
};

// ソート対象の3要素配列.
constexpr float src[3] = { -3.0f,3.0f,-2.3f };
// パターンID取得.
constexpr int sort_pattern = get_sort_pattern_3(src);

// パターンでソート順に取り出し.
constexpr float sort_v0 = src[k_sort_pattern_3[sort_pattern][0]];
constexpr float sort_v1 = src[k_sort_pattern_3[sort_pattern][1]];
constexpr float sort_v2 = src[k_sort_pattern_3[sort_pattern][2]];

// チェック.
static_assert(sort_v0 <= sort_v1 && sort_v1 <= sort_v2);