Кстати, если нужна сортировка именно одномерного массива строк, то тут в теме есть ссылка на сортировку через системные библиотеки. Тестил дома. 1кк массив со строкой 100 обрабатывался на домашнем чуде без малого 2 сек. По числам встроенный сортер косячит и не досортировывает (тестировал на Double), но скорость конечно не сравнимая ни с одним сортером на VBA - 0.78 или около этого на миллионе чисел и моем замшелом компе..
Сортировка в двумерном массиве VBA Excel, Написал тут небольшую процедурку, может кому будет полезна
28.02.2018 15:05:15
|
|
|
|
28.02.2018 15:13:10
Возможно, но хочется удовлетворить творческие потребности, а также попрактиковаться в C#, например, можно... И скомпилировать еще более быструю процедуру, но гарантированную свою, а то нет задач и нет практики.
Изменено: |
|
|
|
28.02.2018 15:26:11
AAF, лично я с C# не знаком, поэтому больше времени уйдет на освоение языка) Ну со сферой применения будут проблемы, т.к. пишу в основном для форума и работы, а на работе решили перейти на профессинольное профильное ПО без всяких экселей и мой проект-долгожительл скоро останется безработным
|
|
|
|
28.02.2018 15:31:28
Данный файл использует код выложенный в сообщении
Все массивы не привязаны к Option Base, а SortStr не привязано к Option Compare. Массив индексов не требует общего LBound с массивом данных. SortBin и SortStr являются отдельными функциональными процедурами. SortAll, используя их, является "менеджером" процедур для упрощения использования и ускорения работы с сортровкой по числовой части с помощью вмонтированного сепаратора. Приложенный файл содержит код самих сортровщиков (SortBin, SortStr, SortAll), а также тестовый стенд с генератором таблиц, допускающий использование вложенной сортировки. Содержание модулей кода: SortCode содержит процедуры готовые к применению по сортировке SamleCode содержит описание и примеры к применению вышеуказанного кода GeneratorTable содержит код относящийся к организации стенда При сортировке через SortAll данные складываются следующим образом: AZ - числа, текст, пустые строки, empty ZA - текст, пустые строки, числа, empty Если есть вопросы или аргументы отличные от использованных в данной реализации пишите и задавайте вопросы...
Изменено: |
|
|
|
22.07.2018 14:25:47
Привет!
Debug - Complie VBA project = Type mismatch: array or user-defined type expected На строке
Excel 2010
Сравнение прайсов, таблиц - без настроек
|
|||||
|
|
22.07.2018 17:01:02
|
|||
|
|
22.07.2018 17:13:57
Открыл скачанный файл, Alt+F11, Debug - Complie VBA project Получил Type mismatch У Вас ведь не так?
Сравнение прайсов, таблиц - без настроек
|
|||
|
|
13.08.2018 12:03:24
Пытаюсь протестировать... 1. Видимо ошибка в описании:
2. Если "Направл. сортировки" в тестовой таблице или в вызывающем модуле задать -1,
PS Отладка показала, что массив a0 формируется неправильно - некоторые значения остаются нулевыми... PPS Можете исправить? Или подсказать - что нужно изменить...
Изменено: |
|||||||
|
|
18.08.2018 14:06:07
Приношу свои извинения, если что не так...
Как смогу - проверю, и, кроме того, код уже переписан, который использую.... Просто не было возможности ответить.... Внесу изменения в течение недели. Еще раз приношу извинения...
Изменено: |
|
|
|
19.08.2018 17:56:12
Сейчас использую SortAll с настройками по умолчанию, но пришлось добавить отдельный перевертыш, т.к. требуется обратная сортировка. И все равно быстрей, чем SortBin с собственной обратной сортировкой. (Гоняю массивы по 750 000 строк примерно 1,2-1,5 сек.) PS В качестве входного и выходного массива использую один и тот же: arr = SortAll(arr, 1) Пробовал переделать под передачу массива по ссылке: SortAll arr, 1 чтоб исключить промежуточные копирования, но почему-то получалось медленнее... возможно из-за того, что в этом случае VBA воспринимает массив arr, как переменную Variant?...
Изменено: |
|||
|
|
19.12.2018 16:08:00
Еще вариант, но по скорости намного скромнее последних здесь представленных:
Изменено: |
|||||
|
|
19.12.2018 16:31:33
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
19.12.2018 18:30:43
Jack Famous, сработало)
|
|
|
|
20.12.2018 10:17:33
ArraySort - СОМ библиотека на С++ (используется так же, как , к примеру, Dictionary, через CreateObject). Функционал (Тип данных: "String"):
1.Сортировка одномерных и двухмерных массивов 2.Удаление дубликатов в одномерных массивах 3.Вывод по одномерному и двухмерному массивам индексов по строкам или столбцам. 4.Сортировка по столбцам, строкам, целому массиву с выводом строки/столбцы, столбцы/строки. 5.Сортировка по 3 ключам (столбцам, строкам) 6.Размерность массива может начинаться с 0,1,2... и т.д. (любого положительного числа, вывод индексов в такой же размерности) 7.Обработка NULL - строк (перемещение на последние позиции) 8.Использованы Интерфейс класса:
array_in_out - указатель на массив (ввод/вывод). sort_order - порядок сортировки : 0-по возрастанию (по умолчанию), 1-по убыванию. key_1 - ключи сортировки (индекс столбца или строки) по умолчанию - первый столбец/строка key_2... key_3... sort_orientation - ориентация сортировки (0 - по строкам, 1 - по столбцам, 2- целый массив вывод строка-столбец, 3- целый массив вывод столбец-строка) delete_duplicates - удаляем дубликаты (в одномерных массивах) out_array_index - выводим индексы (тогда основной массив array_in_out - не меняется, выводятся данные в out_array_index) out_array_index - одномерный массив с индексами (с учетом всех ключей) Все параметры метода, кроме входящего массива - опциональные (с значениями по умолчанию - 0 (ключи-1)) Пример тестирования на VBA:
И самое интересное! Результаты тестирования на 2-х млн. строк и 4-м столбцам: Простая сорт. 1х массива, по возрастанию (по умолч.): 0,21875 сек. Простая сорт.по убыванию 1x массива с удалением-34,55365%: 0,3046875 сек. Вывод индексов для 1х массива, сортировка по убыванию:0,25 сек. Простая сортировка 2х массива: 0,359375 сек. Сортировка 2х массива по 5й строке: 0,3515625 сек. Сортировка всего 2х массива - вывод строки/столбцы: 1,117188 сек. Сортировка всего 2х массива - вывод столбцы/строки 1,195313 сек. Вывод индексов для 2х массива, по указанному столбцу: 0,296875 сек. Вывод индексов для 2х массива, по указанноq строке: 0,2890625 сек. Сортировка 2х массива по 5,6,7й строке: 0,03125 сек. Сортировка 2х массива по 3,4,5му столбцу: 0,9609375 сек. Сортируйте в VBA и удаляйте дубликаты на скоростях С++ до 35 раз быстрее самого быстрого алгоритма (QuickSort) по типу данных: "String"
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||||
|
|
20.12.2018 10:34:27
bedvit, проведена огромная работа и Спасибо за возможность ею пользоваться!
- массив одномерный или плевать на итоговый порядок строк (индексов) одинаковых значений. Ради эксперимента попробуйте отсортировать двумерный массив, где и в первом и втором "столбце" будут дубликаты. - быстрейший, но только как универсал, или для определенных типов данных. Те-же числа можно отсортировать быстрее. |
|||
|
|
20.12.2018 21:09:58
Anchoret, верно. Подправил "Тип данных: Строки".
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
14.03.2019 10:35:17
Anchoret, взял в тестирование)))
а зачем в конце кода Erase aa: Erase cc, ведь следующяя строка заканчивает процедуру и все переменные и так очистятся… Разве не быстрее убрать?…
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
14.03.2019 10:41:41
Jack Famous, Это на всякий пожарный + как я заметил используя процедуру для мониторинга памяти в начале этой темы, что не удаляя массивы в процедуре объем памяти занятый Excel растет.
|
|
|
|
14.03.2019 11:47:39
Anchoret, спасибо - учту
Итак… Сравнил вашу сортировку с Excel'евской. Основное отличие в том, что в xl сортировка НЕ привязана к регистру, то есть "ааа", "АаА", "аАа" и "ААА" имеют одинаковый приоритет. У вас же "ЯЯЯ" будет стоять ПЕРЕД "ааа", как я понял — это из-за того, что в таблице символов сначала идут "ПРОПИСНЫЕ", а уже потом "строчные". Считаю это не совсем корректным и предлагаю сравнивать без учёта регистра. У меня на массиве (15 000,3) сортировка занимает ДО 10 мс, а значит запаса скорости более чем хватает. Можно, конечно, сортировать сначала без учёта регистра (как xl), а при совпадении переходить на сравнение с учётом регистра, но это тот ещё геморрой, который сожрёт немало скорости, а пользы мало. Ещё у вас числа сортируются текстом, но как раз это я проблемой абсолютно не считаю
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||
|
|
14.03.2019 12:04:51
П.С.: Будет время - добавлю вариант без учёта регистра) |
|||||||
|
|
14.03.2019 12:19:54
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
14.03.2019 13:12:38
Jack Famous, Там распределение , поэтому только через U/LCase. Собственно Заменить одну строку кода ближе к началу процедуры и одну при дошлифовке вставками при сравнении.
|
|
|
|
14.03.2019 13:39:27
Вторую часть найти не могу, но, думаю, что строки 47-51 функции…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
14.03.2019 14:23:32
Jack Famous, можно и эту... Правда не знаю сколько займет преображение строки в энное кол-во десятков/сотен тысяч символов к какому-либо регистру.
|
|
|
|
14.03.2019 15:22:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
14.03.2019 15:55:07
Вариант с выбором Compare:
Оптимизировал по памяти и немного по скорости. ------------ Подправил код , который до этого не корректно работал с массивами с нижней границей = 0.
Изменено: |
|||||
|
|
15.03.2019 11:19:01
Anchoret, добрался наконец)) сначала хотел спросить, почему iComp не булево (напрашивается), но потом увидел, что StrComp напрочь отказывается с булевыми сотрудничать даже через двойное отрицание.
Большое вам спасибо за супершуструю функцию! Взял себе в постоянную работу
P.S.: не хотели бы такую же функцию для сортировки одномерных массивов написать?
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||
|
|
15.03.2019 11:43:40
Jack Famous, почему именно функция?) Врядли ее можно приспособить для работы на листе... Но на вкус и цвет...
На тему одномерки: - убираем параметр из процедуры/функции отвечающий за номер сортируемого "столбца" массива - лезем внуть процедуры/функции сортировки и меняем все манипуляции с двумерным массивом на манипуляции с одномерным - в конце, где идет сборка массива убираем один внутренний цикл с соотвюманипуляциями по замене П.С.: По моим оценкам это самый шустрый сортер по тесту из написанных на VBA. Сравнивал с сортировщиком на базе квика внедренным в мой вариант Dictionary:
В общем последний не очень соответствует званию QuickSort. |
|||
|
|
15.03.2019 12:06:20
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||||
|
|
||||||||