Найти тему

📌 Двумерный массив: пузырьковая сортировка (bubble sort). Пример решения

Оглавление

На практике часто возникает необходимость отсортировать массивы по определенным критериям. Распространенным случаем является сортировка двумерного массива, где каждый элемент состоит из двух или более значений.

Но как это сделать эффективно и без лишних сложностей?

Здесь на помощь приходит понимание работы с двумерными массивами и применение соответствующих алгоритмов сортировки. Один из таких алгоритмов, называется сортировкой пузырьком. Этот алгоритм позволяет сравнивать и переставлять элементы массива до тех пор, пока массив не будет полностью упорядочен.

Двумерный массив: пузырьковая сортировка (bubble sort).  Пример решения
Двумерный массив: пузырьковая сортировка (bubble sort). Пример решения

📢 Скачать пример решения вы можете в конце статьи 🔽

-3

Данный обзор демонстрирует частные примеры сортировки двумерного массива по номеру группы и фамилии студента.

⏩ Сортировка пузырьком (Bubble Sort)

Является одним из простых алгоритмов сортировки применяемых для упорядочивания элементов в массиве. Он получил свое название из-за способа перемещения наибольших элементов "всплывающим" способом к концу массива, как пузырек всплывает на поверхность воды.

📚 Принцип работы сортировки Bubble Sort следующий:

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

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

⏩ Как отсортировать двумерный массив с помощью алгоритма Bubble Sort

Как уже упоминалось ранее, основной принцип сортировки пузырьком заключается в последовательном проходе по массиву, сравнении соседних элементов и их перемещении, если они находятся в неправильном порядке. Этот процесс продолжается до полной сортировки массива.

🔶 Рассмотрим пример: Дана таблица студентов, где каждая строка содержит Фамилию и группу:

-5

Требуется упорядочить студентов по Фамилии в алфавитном порядке.

▶️ Пример макроса который отсортирует двумерный массив, состоящий из Фамилии студента и Номера его Группы:

Пример макроса
Пример макроса

🔘 Пояснение к некоторым основным частям кода:

  • Dim Arr() As Variant: Объявляет переменную "Arr" как вариантный массив, который будет содержать значения Фамилии студента и Номера его Группы.
  • LastRow = Cells(Rows.Count, 1).End(xlUp).Row: Определяет последнюю заполненную строку в столбце A, чтобы определить размер массива.
  • Arr = Range("A1:B" & LastRow).Value: Заполняет массив "Arr" значениями из диапазона A1:B (последняя заполненная строка).
  • Вложенные циклы For используют алгоритм сортировки пузырьком для сравнения и перестановки элементов массива в порядке возрастания. Основные шаги сортировки включают:
-7
  • Range("A1:B" & LastRow).Value = Arr: Записывает отсортированные значения массива обратно в таблицу, заменяя исходные данные.

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

Тестируем результат 🔽

Пример решения: как отсортировать двумерный массив с помощью алгоритма сортировки пузырьком
Пример решения: как отсортировать двумерный массив с помощью алгоритма сортировки пузырьком

⏩ "Двойная" сортировка

Усложним задачу. Выполним сортировку по группам, а внутри групп сортировку по Фамилии в алфавитном порядке:

▶️ Вариант 1:

Сначала процедура определяет размер массива, получая номер последней строки с данными в столбце A. Затем она сохраняет данные в массив Arr. 
Далее процедура использует алгоритм сортировки пузырьком для сортировки элементов массива по номеру группы. Вложенные циклы перебирают элементы массива и сравнивают номера групп. Если номер группы в текущем элементе больше номера группы в следующем элементе, элементы меняются местами.
Затем процедура проходит по каждой группе и сортирует фамилии студентов внутри каждой группы. Вложенные циклы сравнивают фамилии студентов и, при необходимости, меняют их местами.
После завершения сортировки, отсортированный массив Arr выводится обратно в таблицу.
Сначала процедура определяет размер массива, получая номер последней строки с данными в столбце A. Затем она сохраняет данные в массив Arr. Далее процедура использует алгоритм сортировки пузырьком для сортировки элементов массива по номеру группы. Вложенные циклы перебирают элементы массива и сравнивают номера групп. Если номер группы в текущем элементе больше номера группы в следующем элементе, элементы меняются местами. Затем процедура проходит по каждой группе и сортирует фамилии студентов внутри каждой группы. Вложенные циклы сравнивают фамилии студентов и, при необходимости, меняют их местами. После завершения сортировки, отсортированный массив Arr выводится обратно в таблицу.

В данном случае сортировка примет вид (примеры теста):

▶️ Вариант 2:

Если требуется "правильная" сортировка групп, содержащее числовое значение больше 10, например:

-11

потребуется использовать специальную функцию для сравнения номеров групп:

  • функция CompareGroups позволяет правильно сравнивать и сортировать номера групп в двумерном массиве по их числовым значениям X и Y.
Функция CompareGroups используется для сравнения номеров групп в двумерном массиве при сортировке. Она принимает два параметра Group1 и Group2, которые представляют номера групп в формате "Группа - X-Y". 
Внутри функции мы извлекаем числовые значения X и Y из обоих номеров групп, используя функцию Split. Затем сравниваем эти числовые значения и возвращаем результат сравнения.
Если числовые значения X1 и X2 различаются, функция возвращает разницу между ними (X1 - X2). Это гарантирует правильную сортировку по числовому значению X. 
Если числовые значения X1 и X2 равны, мы сравниваем числовые значения Y1 и Y2 и возвращаем разницу между ними (Y1 - Y2), чтобы обеспечить правильную сортировку по числовому значению Y.
Функция CompareGroups используется для сравнения номеров групп в двумерном массиве при сортировке. Она принимает два параметра Group1 и Group2, которые представляют номера групп в формате "Группа - X-Y". Внутри функции мы извлекаем числовые значения X и Y из обоих номеров групп, используя функцию Split. Затем сравниваем эти числовые значения и возвращаем результат сравнения. Если числовые значения X1 и X2 различаются, функция возвращает разницу между ними (X1 - X2). Это гарантирует правильную сортировку по числовому значению X. Если числовые значения X1 и X2 равны, мы сравниваем числовые значения Y1 и Y2 и возвращаем разницу между ними (Y1 - Y2), чтобы обеспечить правильную сортировку по числовому значению Y.
  • функция CompareNames позволяет сравнивать и сортировать фамилии студентов в двумерном массиве в алфавитном порядке (без учета регистра символов).
Функция CompareNames используется для сравнения двух имён (Name1 и Name2) с учетом регистра символов (с помощью параметра vbTextCompare) и возвращает результат сравнения в виде целочисленного значения. 
В данном случае, функция StrComp используется для сравнения строк Name1 и Name2. Параметр vbTextCompare указывает на то, что сравнение должно быть регистронезависимым, то есть важно только сами символы, а не их регистр.
Результат сравнения возвращается в виде целочисленного значения:
- если Name1 меньше Name2, возвращается отрицательное число.
- если Name1 больше Name2, возвращается положительное число.
- если Name1 равно Name2, возвращается ноль.
Таким образом, функция CompareNames позволяет сравнивать и сортировать имена в алфавитном порядке, учитывая их регистр.
Функция CompareNames используется для сравнения двух имён (Name1 и Name2) с учетом регистра символов (с помощью параметра vbTextCompare) и возвращает результат сравнения в виде целочисленного значения. В данном случае, функция StrComp используется для сравнения строк Name1 и Name2. Параметр vbTextCompare указывает на то, что сравнение должно быть регистронезависимым, то есть важно только сами символы, а не их регистр. Результат сравнения возвращается в виде целочисленного значения: - если Name1 меньше Name2, возвращается отрицательное число. - если Name1 больше Name2, возвращается положительное число. - если Name1 равно Name2, возвращается ноль. Таким образом, функция CompareNames позволяет сравнивать и сортировать имена в алфавитном порядке, учитывая их регистр.

🔘 Пример кода с использованием функций:

Сначала процедура определяет размер массива, получая номер последней строки с данными в столбце A. Затем она сохраняет данные в массив Arr. 
Далее процедура использует алгоритм сортировки пузырьком для сортировки элементов массива по номеру группы. Вложенные циклы перебирают элементы массива и сравнивают номера групп, используя функцию CompareGroups. Если номер группы в текущем элементе больше номера группы в следующем элементе, элементы меняются местами.
Затем процедура проходит по каждой группе и сортирует фамилии студентов внутри каждой группы. Вложенные циклы сравнивают фамилии студентов и, при необходимости, меняют их местами, используя функцию CompareNames.
После завершения сортировки, отсортированный массив Arr выводится обратно в таблицу.
Сначала процедура определяет размер массива, получая номер последней строки с данными в столбце A. Затем она сохраняет данные в массив Arr. Далее процедура использует алгоритм сортировки пузырьком для сортировки элементов массива по номеру группы. Вложенные циклы перебирают элементы массива и сравнивают номера групп, используя функцию CompareGroups. Если номер группы в текущем элементе больше номера группы в следующем элементе, элементы меняются местами. Затем процедура проходит по каждой группе и сортирует фамилии студентов внутри каждой группы. Вложенные циклы сравнивают фамилии студентов и, при необходимости, меняют их местами, используя функцию CompareNames. После завершения сортировки, отсортированный массив Arr выводится обратно в таблицу.

Результат 🔽

-15

Подводя итог...

Представленное решение служит примером и основан на предположении о структуре данных и логике сортировки. Перед использованием кода важно убедиться в его соответствии вашим конкретным требованиям и протестировать его на соответствующих данных.

В реальных сценариях вы можете внести изменения в код в зависимости от ваших конкретных условий и требований.

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

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

А какие варианты сортировки применяете вы? Оставляйте ответ в комментариях 📝

Другие материалы по теме 🔽

➡️ СКАЧАТЬ ПРИМЕР

Наша команда очень заинтересована в создании качественного и полезного контента. Поэтому, если Вам понравился этот урок, не забудьте поблагодарить автора лайком 👍. Если у Вас есть вопросы или своё решение, не стесняйтесь оставить комментарий 💬. Нужно решение для другой проблемы? Пожалуйста, напишите свой вопрос в комментариях 💬, и мы обязательно рассмотрим его в ближайшей теме обзора. Мы ценим Вашу обратную связь 💝, так как это помогает нам оценить, насколько данный материал был полезен для Вас
Наша команда очень заинтересована в создании качественного и полезного контента. Поэтому, если Вам понравился этот урок, не забудьте поблагодарить автора лайком 👍. Если у Вас есть вопросы или своё решение, не стесняйтесь оставить комментарий 💬. Нужно решение для другой проблемы? Пожалуйста, напишите свой вопрос в комментариях 💬, и мы обязательно рассмотрим его в ближайшей теме обзора. Мы ценим Вашу обратную связь 💝, так как это помогает нам оценить, насколько данный материал был полезен для Вас