Можно попробовать Linq ; сначала мы превращаем начальные list
в группы
{1, 1, 1}
{2, 2, 2}
{3, 3, 3}
{4}
Затем перечислите элементы в этих группах - {{1, 2, 3, 4}, {1, 2, 3}, {1, 2, 3}}
и сгладьте их: {1, 2, 3, 4, 1, 2, 3, 1, 2, 3}
. Давайте извлечем его как метод:
Код:
private static List<int> MySort(IEnumerable<int> list) {
var groups = list
.GroupBy(item => item)
.Select(chunk => new {
value = chunk.Key,
count = chunk.Count()
})
.OrderBy(item => item.value)
.ToArray();
int maxCount = groups.Max(group => group.count);
return Enumerable
.Range(0, maxCount)
.SelectMany(i => groups
.Where(chunk => chunk.count > i)
.Select(chunk => chunk.value))
.ToList();
}
Демо-версия:
List<int>[] tests = new List<int>[] {
new List<int>() { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4 },
new List<int>() { 1, 1, 1, 3, 4, 4, 4, 4, 4, 5, 10 },
};
var demo = string.Join(Environment.NewLine, tests
.Select(test => $"{string.Join(", ", test),-35} -> {string.Join(", ", MySort(test))}"));
Console.Write(demo);
Результат:
1, 1, 1, 2, 2, 2, 3, 3, 3, 4 -> 1, 2, 3, 4, 1, 2, 3, 1, 2, 3
1, 1, 1, 3, 4, 4, 4, 4, 4, 5, 10 -> 1, 3, 4, 5, 10, 1, 4, 1, 4, 4, 4