|
|
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Необходимо отcортировать одномерный массив строк используя только VBA . Пузырьковый метод в топку. На форуме не раз упоминали про copymemory, однако нигде не нашел конечного варианта функции/процедуры, имеющей на входе массив, а на выходе, например, массив индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 10:22 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
посмотри в разделе Visual Basic, а не Microsoft Office ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 10:51 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 11:15 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloder, вариантов кагбэ тьма. Вот парочка из классики: Quick sort Shell sort См. комментарии для заточки под строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 12:53 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloder 1. Запишите свой строковый массив в столбец ячеек рабочего листа excel. 2. Примените к рабочему листу встроенный метод Worksheet.Sort 3. Считайте значения отсортированного слобца ячеек обратно в строковый массив. 4. Готово! Все условия задачи соблюдены. Использован именно VBA, а не VB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 16:14 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Shamanus, в свойстве Sort нельзя указывать поле Variant? приведенный ниже код выдает ошибку, но работает, если делать сортировку числового массива по полю adInteger рекордсета Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 16:29 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloder, а как вы себе представляете сортировку массива вариант? что раньше идет, "2" или "10"? с точки зрения текста идет так Шапка1102 а с точки зрения чисел Шапка1210ясное дело нужно тут заводить единый тип данных. Если данные типа Variant, то лучше наверное текст. код готовый Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 18:05 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
кстати и erase и redim массиву тоже совсем не стоит делать. Размерность то остается прежней. А если Вам нужны индексы то я бы сделал так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 18:09 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Стоит признать, что сортировка массива методом QuickSort предпочтительнее RecordSet. Несмотря на то, что сортировка внутри RecordSet происходит очень быстро, очень большое время убивается на то чтобы записать массив в RS и наоборот. Особенно много времени уходит на запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2010, 16:38 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloderСтоит признать, что сортировка массива методом QuickSort предпочтительнее RecordSet. Несмотря на то, что сортировка внутри RecordSet происходит очень быстро, очень большое время убивается на то чтобы записать массив в RS и наоборот. Особенно много времени уходит на запись. Вы правы, на маленьких массивах побеждает QuickSort, в общем для потомков хронометражи различными методами сделал вот таким кодом сортировку, сортировка по убыванию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. получил вотДля словВремя заполнения массива:0Время сортировки:26Первый элемент массива:999999 Время заполнения массива:0Время сортировки:28Первый элемент массива:999999 и формулу наполнения массивам изменил на Код: plaintext Для чиселВремя заполнения массива:0Время сортировки:1Первый элемент массива:30030Время заполнения массива:0Время сортировки:48Первый элемент массива:30030Получается тут рекордсет побыстрее. Теперь проведу проверку на 5000 раз сортировать массивы по 100 элементов. код такой код такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. результаты тестов первая строка - рекордсет, вторая квиксорт Результат для чиселВремя сортировки:10Время сортировки:3 Результат для словВремя сортировки:10Время сортировки:2 изменим массив на 1000 элементов и 500 прогонов Результат для 1000 словВремя сортировки:10Время сортировки:5 Результат для 3000 словВремя сортировки:12Время сортировки:7 Результат для 10000 словВремя сортировки:22Время сортировки:17 ну и сделал хронометраж сортировки 1 млн. элементов хронометражВремя записи:16Время сортировки:3Время чтения:6резюме запись занимает 64% времени. Но зато когда записан - quick sort отдыхает. 3 секунды к 28. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2010, 18:40 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Дорогой Shamanus я, конечно, понимаю, что это Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 00:47 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Согласен с 13-й квартал с точки зрения подтасовки. Массив для теста лучше делать рандомным. Однако, Shamanus, какой код для QuickSort вы используете? Я взял за образец приведенный на этом форуме код . Вот конечный вариант: QuickSortNonRecursive Код: plaintext Данный QuickSort сортирует одинаково быстро как и приведенный вами пример упорядоченного числового массива i+i/1000 с миллионом записей, так и рандомные числовые/строковые массивы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 12:13 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloder, 13-й квартал ну во первых я так понимаю Вы предлагаете сортировать список 1,2,3 по возрастанию для оценки эффективности алгоритма? Мне почему то казалось, что оценка задержки в "худшем" случае и есть оценка эффективности или будем надеяться, что он никогда не наступит, а значит машина времени создана алгоритм идеален? а во вторых я наоборот признал более высокую эффективность quick sort на массивах. Что Вас не устраивает? Несмотря на то, что метод sort для Recordset в разы быстрее - скорость записи массива и чтения из recordset это преимущество сводит на нет. и наконец в третьих - мой пост следует читать так: Вывод: если данные находятся в массиве - сортируйте QuickSort, если уже лежат в Recordset, то метод Sort быстрее чем даже QuickSort - не говоря уж о сэкономленных миллисекундах на чтении и записи этого Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 13:36 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Shamanusоценка задержки в "худшем" случае и есть оценка эффективности спорный вопрос мое замечание касается исключительно вашего QuickSorta: почему работает медленно? возможно что мой вариант учитывает крайние случаи, а ваш нет, но это только предположение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 14:29 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloderспорный вопрос ну как сказать. В таком случае те кто пишут многопользовательские приложения могли бы проводить тесты скорости на 1 м пользователе. А те кто разрабатывают базы данных могли бы тестировать скорость на селекте 10 записей из индексированной таблицы. Только обычно когда тестируют СУБД перед покупкой пытаются запустить самый невероятно сложный селект, который только попадался на практике. впрочем у каждого свое мнение на этот счет. «Имхо у нас у всех имхастое» (с) paveloderмое замечание касается исключительно вашего QuickSorta: почему работает медленно? Думаю у Вас есть возможность проверить работу того алгоритма который использовал я из этого поста 9862385 и своего. Заодно увидим эффективность каждого из алгоритмов. Ваш код у меня запустить не удалось из-за неизвестного типа данных, а искать библиотеку или описание лень.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 14:54 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
ShamanusВаш код у меня запустить не удалось из-за неизвестного типа данных сорри забыл указать в своем посте описание типа Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 15:11 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloder, код теста такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. итог для 10 тыс записей где x(i) = Round(Rnd * 1000, 0)Итерация 1____________________________ Время сортировки QSNR:63 Время сортировки QS:31 Итерация 2____________________________ Время сортировки QSNR:47 Время сортировки QS:31 Итерация 3____________________________ Время сортировки QSNR:62 Время сортировки QS:32 Итерация 4____________________________ Время сортировки QSNR:47 Время сортировки QS:31 Итерация 5____________________________ Время сортировки QSNR:62 Время сортировки QS:32 Итерация 6____________________________ Время сортировки QSNR:46 Время сортировки QS:32 Итерация 7____________________________ Время сортировки QSNR:47 Время сортировки QS:31 Итерация 8____________________________ Время сортировки QSNR:63 Время сортировки QS:31 Итерация 9____________________________ Время сортировки QSNR:47 Время сортировки QS:31 Итерация 10____________________________ Время сортировки QSNR:63 Время сортировки QS:31 для 5тыс записей где x(i) = Round(Rnd * 1000, 2)Итерация 1____________________________ Время сортировки QSNR:31 Время сортировки QS:16 Итерация 2____________________________ Время сортировки QSNR:31 Время сортировки QS:16 Итерация 3____________________________ Время сортировки QSNR:31 Время сортировки QS:15 Итерация 4____________________________ Время сортировки QSNR:16 Время сортировки QS:16 Итерация 5____________________________ Время сортировки QSNR:31 Время сортировки QS:16 Итерация 6____________________________ Время сортировки QSNR:31 Время сортировки QS:15 Итерация 7____________________________ Время сортировки QSNR:32 Время сортировки QS:15 Итерация 8____________________________ Время сортировки QSNR:16 Время сортировки QS:16 Итерация 9____________________________ Время сортировки QSNR:16 Время сортировки QS:15 Итерация 10____________________________ Время сортировки QSNR:32 Время сортировки QS:15 ну и для проверки 10 тыс записей с x(i) = CStr(Round(Rnd * 1000, 0))Итерация 1____________________________ Время сортировки QSNR:78 Время сортировки QS:63 Итерация 2____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 3____________________________ Время сортировки QSNR:79 Время сортировки QS:78 Итерация 4____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 5____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 6____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 7____________________________ Время сортировки QSNR:94 Время сортировки QS:62 Итерация 8____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 9____________________________ Время сортировки QSNR:78 Время сортировки QS:78 Итерация 10____________________________ Время сортировки QSNR:79 Время сортировки QS:78 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 15:27 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Нашел ошибку в направлении сортировки, в коде разные применялись. Но на итоги это не повлияло. Можете перепроверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2010, 15:30 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
Shamanus, а теперь протестируйте таким же макаром x(i)=i на 1000 элементов ваш QuickSort встанет думаю, что разница наших методов состоит в первоначальном приближении в каждой итерации стэка: в вашем берется значение конца стэка, в моем - значение середины стэка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2010, 01:01 |
|
||
|
Сортировка строкового/числового массива в VBA
|
|||
|---|---|---|---|
|
#18+
paveloderдумаю, что разница наших методов состоит моего метода тут нет. я и Ваш и другой взял на этой ветке форума. Тестировать больше ничего не буду, уже все закрыл не сохраняя. Хотите возьмите коды для теста и потестируйте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2010, 08:22 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=36992468&tid=2177399]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 413ms |

| 0 / 0 |
