Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Как можно отсортировать массив по количеству наиболее повторяемых значений?

Например, есть отсортированный массив array:
1
1
1
2
3
3
4
4
4
4
5
6
6
7
8
Так вот, как отсортировать массив по количеству наиболее повторяемых значений:
4
4
4
4
1
1
1
6
6
3
3
8
7
5
2
  • Вопрос задан
  • 149 просмотров
Решения вопроса 3
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
int[] array = {1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 8};
var sortedByFrequency = array
    .GroupBy(o => o)
    .OrderByDescending(o => o.Count())
    .ThenByDescending(o => o.Key)
    .SelectMany(o => o)
    .ToArray();
Console.WriteLine(string.Join(",",sortedByFrequency.Select(o => o.ToString())));
//4,4,4,4,1,1,1,6,6,3,3,8,7,5,2


Это если в одно LINQ выражение. Если нужно что-то очень быстрое для больших входных массивов, то стоит поискать что-то другое
Ответ написан
Комментировать
Можно как-то так через кастомный IComparer:
var arr = new int[] { 1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 8 };

var index = arr.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
var result = arr.OrderByDescending(x => x, new CountComparer(index)).ToArray();

class CountComparer : IComparer<int>
{
    private readonly IReadOnlyDictionary<int, int> _index;
    public CountComparer(IReadOnlyDictionary<int, int> index)
    {
        _index = index;
    }

    public int Compare(int x, int y)
    {
        var comparsion = _index[x].CompareTo(_index[y]);
        if (comparsion == 0)
            return x.CompareTo(y);
        return comparsion;
    }
}

Ну или можно самому написать алгоритм, но всё равно первым шагом надо будет пройтись по всему массиву с подсчётом повторений.
Хотя мб можно как-то оптимизировать, если предположить, что изначально массив отсортирован по возрастанию.
Ответ написан
Комментировать
bingo347
@bingo347
Crazy on performance...
Можно использовать вариацию сортировки подсчетом, в которой на втором шаге сортируются не сами значения, а их количественная оценка
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы