Сортировка в двумерном массиве методом распределения VBA Excel, Выношу на суд форумной общественности совместный с AAF труд по написанию альтернативы всем известным методам сортировки в массивах.
Так уж получилось, что мне редко когда нравятся утвержденные стандарты и общепринятые алгоритмы. Все началось со стандартного Excel сортера, а точнее с попытки найти ему альтернативу в рабочем файле весом порядка 20 мб, с парой десятков листов нашпигованных формулами, и примерно таким же количеством VBA модулей. Excel сортировщик - это мощный инструмент с множеством опций и пр., но у него есть один недостаток - привязка к листу. Т.е. если вдруг возникла необходимость промежуточной сортировки массива, то нужно либо в текущем файле создавать лист, выгружать данные, сортировать, загружать обратно в массив, удалять лист. Либо создавать новую книгу со всеми выше описанными манипуляциями. Не очень удобно... И понеслось: "пузырьки" во всех их ипостасях, "вставки" и пр.. У всех методов сортировки есть свои плюсы и минусы. Какие-то слишком долгие, другие (например QuickSort) не совсем подходят для двумерных массивов ввиду небрежного отношения к индексам. Вот и решил написать свой вариант. Сильно помог AAF со своим вариантом сортировщика.
В основу алгоритма положен метод первичного распределения исходных данных по группам и по матрицам. Далее уже идет досортировка. Алгоритм или как все это работает:
Скрытый текст
- анализируется содержимое опорного столбца (по которому идет сортировка) на типы данных в нем представленных: числа (отрицательные и положительные), даты, текст. - в зависимости от типа данных подключаются субсортеры заточенные на определенный вид данных - далее распределение по деревьям/матрицам и досортировка - на финише сборка и деиндексация массива с перезаписью основного (входного) массива.
Плюсы и минусы:
Скрытый текст
+ на данных с равномерным распределением по значению этот метод идеален, т.е. линейное время сортировки. Зачастую время оценки входных данных больше времени самой сортировки - на числовых данных с малым интервалом по значению образующих своеобразные кластеры - уже все не так радужно - большой объем кода, как говорится: "без стакана не разберешься". Со стаканом спрочем тоже...
Во вложенном файле несколько модулей:
Скрытый текст
- Arr_sorters_test - тестовый стенд для оценки и сравнения описываемого здесь метода с другими - Clever_AAF_ - первоначальная версия распределителя с сотрировщиком AAF - CleverSort_UPD_ - итоговая версия, где труженнику от AAF поручена досортировка текста - TXT_Sorters - пара альтернативных версий для сортировки текста.
где в одномерном arr() - номер сортируемого столбца, направление сортировки (False - по возрастанию, True - по убыванию). Столбцов может быть несколько, но по каждому нужно указывать направление сортировки. Т.е. мульти сортинг. qwerty - сортируемый массив.
В коде есть комментарии. Модуль с набором процедур сортировщика можно экспортировать и вставить в Ваши проекты. Тема, где все это рождалось: Сортировка в двумерном массиве VBA Excel