Что это за сортировка такая – метод пересчёта? Различные виды сортировок массивов мы рассматривали в статьях №130, №131 и №132. Давайте рассмотрим ещё один и поймем с чем его «едят».
Как и в прошлом примере (не будем изобретать велосипед) начинаться будет с макроса СоздатьМассивОбратногоПорядка который создает массив чисел в обратном порядке. Количество элементов массива задаёт пользователь (всё описано в прошлой статье). А вот вторую процедуру я назвал МассивПересчетом, которая сортирует массив в столбец Б порядке возрастания. Единственным минусом всего этого является то, что алгоритм сортировки методом пересчета ограничен типами данных Integer и Long. Плюсом, что работает очень быстро.
Как всегда, на макрос я назначил большую зелёную кнопку. Вот как это выглядит на экране:,
Если помните в статье №132 сортировка массива в миллион элементов на рабочем листе заняла 1,82 секунды, здесь же 1,47 (конечно это не особо заметно, но всё же).
Если коротко, то вот как он работает:
- Создание массива и ввод данных: При запуске макроса сначала пользователю предлагается ввести количество элементов массива. Затем создаются два массива: Массив1 и МассивЧисел. Массив1 используется для хранения чисел в обратном порядке, а МассивЧисел - для числовых значений, которые будут отсортированы.
- Заполнение массивов: После создания массивов они заполняются числами в обратном порядке от Элементы до 1.
- Помещение массива в таблицу: массив Массив1 помещается в столбец "A" на листе Excel.
- Сортировка массива: Используется процедура МассивПересчетом, которая сортирует массив чисел в порядке возрастания. Вспомогательные функции Minimum и Maximum находят минимальное и максимальное значения в массиве.
- Помещение отсортированного массива в таблицу: Отсортированный массив МассивЧисел помещается в столбец "B" на листе Excel.
- Отображение времени сортировки: Макрос выводит сообщение с временем, затраченным на сортировку массива.
Макрос СоздатьМассивОбратногоПорядка уже описан в прошлой статье, там поменялась только одна строка:
- Call БыстраяСортировка(МассивЧисел, LBound(МассивЧисел), UBound(МассивЧисел))
На
- Call МассивПересчетом(МассивЧисел, LBound(МассивЧисел), UBound(МассивЧисел))
Вот как выглядит код макроса МассивПересчетом и его дополнительных функций Minimum и Maximum:
Заметьте, что коде есть пояснения (зеленым). Если на скриншоте плохо видно, то в файле это видно.