using System.Collections.Generic;
public static class Program
public static void Main()
var random = new Random();
var source = Enumerable.Range(1, 15).Select(_ => random.Next(1, 6)).ToArray();
Console.WriteLine($"Source: {String.Join(", ", source)}");
SortTriplets(source, (a, b) =>
var ret = Comparer<int>.Default.Compare(a.Item1, b.Item1);
if (ret == 0) ret = Comparer<int>.Default.Compare(a.Item2, b.Item2);
Console.WriteLine($"Sorted: {String.Join(", ", source)}");
public static void SortTriplets<T>(this T[] source, Comparison<(T, T, T)> comparison)
var indices = new int[source.Length / 3];
for (int i = 0; i < indices.Length; i++) indices[i] = i;
Array.Sort<int>(indices, (a, b) =>
(source[a], source[a + 1], source[a + 2]),
(source[b], source[b + 1], source[b + 2]));
for (int i = 0; i < indices.Length - 1; i++)
while (k < i) k = indices[k];
(T, T, T) temp = (source[a], source[a + 1], source[a + 2]);
source[a + 1] = source[b + 1];
source[a + 2] = source[b + 2];
source[b + 1] = temp.Item2;
source[b + 2] = temp.Item3;