Как отсортировать двумерный массив
Перейти к содержимому

Как отсортировать двумерный массив

Как с помощью .sort() отсортировать двумерный массив?

user avatar

Если у вас нативный массив типо int ** то его можно сортировать как одномерный.

user avatar

Если Вам нужно, то, что на рисунке ниже, а также, нужен сам алгоритм сортировки (технология), то разбирайтесь с моим кодом.

alt text

Код сортировки методом «пузырька» — один из самых простых и самых несовершенных:

Как я уже выше объяснил, метод пузырька очень неэффективный, более совершенный алгоритм ниже (вариант для сортировки по строкам):

Этот код можно оптимизировать, если в 2 раза сократить число проходов цикла прокрутки столбцов — если в сортирующем цикле искать и минимум, и максимум, а в этом цикле минимум отправлять в начало строки (или столбца), а максимум в конец. Для сортировки массивов существует полно алгоритмов, но, насколько мне известно, самые оптимальные алгоритмы оправдывают себя только при сортировке больших массивов.

Как отсортировать двумерный (прямоугольный) массив в C #?

У меня есть двумерный массив (строк), который составляет мою таблицу данных (строк и столбцов). Я хочу отсортировать этот массив по любому столбцу. Я пытался найти алгоритм для этого на C #, но безуспешно.

Любая помощь приветствуется.

13 ответы

Загрузите свой двумерный массив строк в фактический DataTable (System.Data.DataTable), а затем используйте метод Select () объекта DataTable для создания отсортированного массива объектов DataRow (или используйте DataView для аналогичного эффекта).

Вы также можете написать свой собственный метод для сортировки двумерного массива. Оба подхода были бы полезны для обучения, но подход DataTable поможет вам начать изучение лучшего способа обработки таблиц данных в приложении C #.

ответ дан 24 окт ’08, 05:10

Звучит интересно, не могли бы вы опубликовать или дать ссылку на примеры кода. — разъем

Выполнено. Может где-то баг — записал в блокнот. — MusiGenesis

Удивительно, что вы написали это в блокноте — во всяком случае, это сработало очень хорошо. Спасибо. — разъем

Могу я проверить — вы имеете в виду прямоугольный массив ( [,] ) или зубчатый массив ( [][] )?

Сортировать зубчатый массив довольно просто; Я обсуждаю это здесь. Очевидно, что в этом случае Comparison<T> будет включать столбец вместо сортировки по порядковому номеру — но очень похоже.

Сортировка прямоугольного массива сложнее . У меня, вероятно, возникнет соблазн скопировать данные либо в прямоугольный массив, либо в List<T[]> , и отсортировать там, затем скопируйте обратно.

Вот пример использования зубчатого массива:

Для работы с прямоугольным массивом . ну, вот код для переключения между ними на лету .

ответ дан 24 окт ’08, 11:10

Какие изменения нужно сделать в методе Sort, чтобы отсортировать данные по убыванию. — Гемам

@Хомам comparer.Compare(y[col],x[col])) (задний ход x и y там) — Марк Гравелл ♦

Ссылка на — это заархивированная статья Джима Мишела из InformIt, которая обрабатывает сортировку как для прямоугольных, так и для зубчатых многомерных массивов.

В этом примере массив фактически не сортируется; LINQ создаст отсортированную последовательность, но только если вы зафиксируете результат . он не сортирует существующий массив. Это может быть просто: string [] names = <"Смит", "Снайдер", "Бейкер", "Джонсон", "Баллмер">; Array.Sort (имена); — Марк Гравелл ♦

Я понимаю, о чем вы говорите — я уберу ошибочный пример, но оставлю ссылку на сортировочную статью. PS — спасибо, что сообщили мне причину голосования против. Вы не часто видите это, но это действительно конструктивно! — Дуг Л.

Ссылка не работает. Он перенаправляет на домашнюю страницу веб-сайта — КЛС

Спасибо KFL, я отредактировал ссылку, чтобы указать на архивную версию. Как бы я ни предпочел разместить для них ссылку на текущую версию на сайте InformIT, мне нелегко найти этот контент. Вроде убрали. — Дуг Л.

Добро пожаловать в SO. Пожалуйста, не размещайте код, только ответы. Поскольку код для вас прост, другим может быть сложно понять его и почему вы использовали этот подход. Пожалуйста, поясните свой код, почему вы сделали это именно так. Также обратите внимание, что этот вопрос из 2008 года. — Корашен

Этот код должен делать то, что вам нужно, я не обобщал его для n на n, но это просто. Тем не менее — я согласен с MusiGenesis, используя другой объект, который немного лучше подходит для этого (особенно если вы собираетесь делать какие-либо привязки)

Итак, ваш массив структурирован следующим образом (я буду говорить псевдокодом, потому что мой C # -fu слабый, но я надеюсь, что вы уловили суть того, что я говорю)

So value[1][3] — значение в строке 1, столбце 3.

Вы хотите отсортировать по столбцам, поэтому проблема в том, что ваш массив отклонен на 90 градусов.

Не могли бы вы просто повернуть его в качестве первого разреза?

Если вы знаете, что хотите сортировать только один столбец за раз, вы можете значительно оптимизировать это, просто извлекая данные, которые вы хотите отсортировать:

В C ++ вы можете поиграть с тем, как вычислить смещения в массиве (поскольку вы можете рассматривать свой двумерный массив как одномерный массив), но я не уверен, как это сделать в C #.

ответ дан 24 окт ’08, 05:10

Попробуйте это. Основная стратегия состоит в том, чтобы отсортировать отдельный столбец независимо и запомнить исходную строку записи. Остальная часть кода будет циклически перебирать отсортированные данные столбца и заменять строки в массиве. Сложная часть — это помнить об обновлении исходного столбца, поскольку часть подкачки эффективно изменяет исходный столбец.

ответ дан 24 окт ’08, 06:10

Если бы вы могли получить данные в виде универсального кортежа при чтении или извлечении, это было бы намного проще; тогда вам просто нужно будет написать функцию сортировки, которая сравнивает желаемый столбец кортежа, и вы получите одномерный массив кортежей.

ответ дан 26 окт ’08, 07:10

Это старый вопрос, но вот класс, который я только что построил на основе статья Джима Мишеля в InformIt связаны Дуг Л.

Учитывая несортированный 2D-массив data произвольного размера, который вы хотите отсортировать по столбцу 5, вы просто делаете это:

Обратите внимание на виртуальный Compare метод и защищенный SortArray поэтому вы можете создавать специализированные подклассы, которые всегда сортируют по определенному столбцу или выполняют специализированную сортировку по нескольким столбцам, или что угодно, что вы хотите. Вот почему CompareStrings разбит и защищен — любые подклассы могут использовать его для простых сравнений вместо того, чтобы набирать полный SortArray[x, col].CompareTo(SortArray[y, col]) синтаксис.

ответ дан 23 мая ’17, 12:05

Мне нравится подход DataTable, предложенный MusiGenesis выше. Приятно то, что вы можете сортировать по любой допустимой строке SQL ‘order by’, которая использует имена столбцов, например, «x, y desc, z» вместо ‘order by x, y desc, z’. (FWIW, мне не удалось заставить его работать, используя порядковые номера столбцов, например, «3,2,1» для «порядка 3,2,1»). Я использовал только целые числа, но очевидно, что вы могли добавить данные смешанного типа в DataTable и отсортируйте его любым способом.

В приведенном ниже примере я сначала загрузил некоторые несортированные целочисленные данные в tblToBeSorted в песочнице (не показано). Поскольку таблица и ее данные уже существуют, я загружаю ее (без сортировки) в двумерный целочисленный массив, а затем в DataTable. Массив DataRows — это отсортированная версия DataTable. Пример немного странный, поскольку я загружаю свой массив из БД и мог бы отсортировать его тогда, но я просто хотел получить несортированный массив в C # для использования с объектом DataTable.

Я знаю, что уже поздно, но вот моя мысль, которую вы могли бы рассмотреть.

например это массив

и вы хотите преобразовать его по столбцу номер 2, тогда

Поздравляем, вы отсортировали массив по желаемому столбцу. Вы можете отредактировать его, чтобы он работал с другими типами данных.

ответ дан 27 окт ’19, 16:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# arrays sorting or задайте свой вопрос.

Сортировка пузырьком

И дея алгоритма очень простая. Идём по массиву чисел и проверяем порядок (следующее число должно быть больше и равно предыдущему), как только наткнулись на нарушение порядка, тут же обмениваем местами элементы, доходим до конца массива, после чего начинаем сначала.

Отсортируем массив <1, 5, 2, 7, 6, 3>
Идём по массиву, проверяем первое число и второе, они идут в порядке возрастания. Далее идёт нарушение порядка, меняем местами эти элементы
1, 2, 5, 7, 6, 3
Продолжаем идти по массиву, 7 больше 5, а вот 6 меньше, так что обмениваем из местами
1, 2, 5, 6, 7, 3
3 нарушает порядок, меняем местами с 7
1, 2, 5, 6, 3, 7
Возвращаемся к началу массива и проделываем то же самое

1, 2, 5, 3, 6, 7
1, 2, 3, 5, 6, 7

Говорят, что это похоже на «всплытие» более «лёгких» элементов, как пузырьков, отчего алгоритм и получил такое название.

Этот алгоритм всегда будет делать (n-1) 2 шагов, независимо от входных данных. Даже если массив отсортирован, всё равно он будет пройден (n-1) 2 раз. Более того, будут в очередной раз проверены уже отсортированные данные.

Пусть нужно отсортировать массив 1, 2, 4, 3

1 2 4 3
1 2 4 3
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

После того, как были поменяны местами элемента a[2] и a[3] нет больше необходимости проходить этот участок массива. Примем это во внимание и переделаем алгоритм

Ещё одна реализация

В данном случае будет уже вполовину меньше шагов, но всё равно остаётся проблема сортировки уже отсортированного массива: нужно сделать так, чтобы отсортированный массив функция просматривала один раз. Для этого введём переменную-флаг: он будет опущен (flag = 0), если массив отсортирован. Как только мы наткнёмся на нарушение порядка, то флаг будет поднят (flag = 1) и мы начнём сортировать массив как обычно.

В этом случае сложность также порядка n 2 , но в случае отсортированного массива будет всего один проход.

Теперь усовершенствуем алгоритм. Напишем функцию общего вида, чтобы она сортировала массив типа void. Так как тип переменной не известен, то нужно будет дополнительно передавать размер одного элемента массива и функцию сравнения.

Функция выглядит некрасиво – часто вычисляется адрес текущего и предыдущего элемента. Выделим отдельные переменные для этого.

Теперь с помощью этих функций можно сортировать массивы любого типа, например

Сортировка многомерного массива

С ортировка статического многомерного массива по существу не отличается от сортировки одномерного. Можно воспользоваться тем свойством, что статический одномерный и многомерный массивы имеют одинаковое представление в памяти.

Сортировка динамически созданного двумерного массива может быть произведена двумя способами. Во-первых, можно по определённому алгоритму находить индекс i-го и j-го элемента по порядковому номеру k от 0 до n * m.

Во-вторых, можно сначала переместить массив в одномерный, отсортировать одномерный массив, после чего переместить его обратно в двумерный.

Если вас смущает эта функция, то воспользуйтесь типизированной. Вызов, из предыдущего примера

email

Всё ещё не понятно? – пиши вопросы на ящик

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *