кроме как на листе, конечно..
Живи и дай жить..
09.01.2009 11:39:01
кроме как на листе, конечно..
Живи и дай жить..
|
|
|
|
09.01.2009 11:46:14
|
|
|
|
09.01.2009 12:26:53
Вообще есть куча разнообразных способов и методов... Вот еще один:
P.S. Google рулит) |
|
|
|
09.01.2009 15:28:54
Очень интересные демо показы различных сортировок
|
|
|
|
09.01.2009 15:36:47
Может кто-нибудь переведёт сортировку Fast Quick Sort (by Denis Ahrens) с Си на VBA ? )
Тут Demo (внизу) а тут код |
|
|
|
09.01.2009 15:54:19
В VBA насколько я понимаю, ф-ции swap нету. Значит, напрямую преобразовать Си-пример в код VBA не получится. Вот в этой теме -
|
|
|
|
09.01.2009 15:56:40
Блин, до конца не разобрался) Swap - это ж отдельная процедура) Тогда пример Турбо-Ежа - точно Fast Quick Sort.
|
|
|
|
09.01.2009 19:35:42
Потестил 2 способа Ежа и по ссылке
с помощью Sub TestSort() Dim iEntry() Dim j: j = 1000000 ReDim iEntry(1 To j) For iOuter = LBound(iEntry()) To UBound(iEntry()) iEntry(iOuter) = Int((20 * Rnd) - 10) Next Start1 = Timer Call ShellSort2(iEntry()) MsgBox Format((Timer - Start1), "00:00") End Sub Так вот, сортировка Ежа на миллионе случайных чисел - 21 секунда, вторая сортировка - 7 секунд.. Кстати, может кто-нибудь знает алгоритм извлечения уникальных элементов,кроме последовательного перебора отсортированного массива |
|
|
|
09.01.2009 20:19:37
скачал алгоритм qsort с
только там в "NumberOfArrayDimensions" надо заменить как минимум Dim Res As Integer на Dim Res As long а лучше вообще так: Private Function NumberOfArrayDimensions(arr As Variant) As Integer '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' NumberOfArrayDimensions ' This function returns the number of dimensions of an array. An unallocated dynamic array ' has 0 dimensions. This condition can also be tested with IsArrayEmpty. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Dim Ndx As Long On Error GoTo ex ' Loop, increasing the dimension index Ndx, until an error occurs. ' An error will occur when Ndx exceeds the number of dimension ' in the array. Return Ndx - 1. Do Ndx = Ndx + 1 If UBound(arr, Ndx) Then: Loop ex: NumberOfArrayDimensions = Ndx - 1 End Function а так довольно быстро работает.
Живи и дай жить..
|
|
|
|
09.01.2009 20:27:59
{quote}{login=Артем}{date=09.01.2009 07:35}{thema=}{post}Потестил 2 способа Ежа и по ссылке
с помощью Sub TestSort() Dim iEntry() Dim j: j = 1000000 ReDim iEntry(1 To j) For iOuter = LBound(iEntry()) To UBound(iEntry()) iEntry(iOuter) = Int((20 * Rnd) - 10) Next Start1 = Timer Call ShellSort2(iEntry()) MsgBox Format((Timer - Start1), "00:00") End Sub Так вот, сортировка Ежа на миллионе случайных чисел - 21 секунда, вторая сортировка - 7 секунд.. Кстати, может кто-нибудь знает алгоритм извлечения уникальных элементов,кроме последовательного перебора отсортированного массива{/post}{/quote} по извлечению уникальных элементов посмотрите здесь: сортировать не надо.. лучший способ с scripting.dictionary но и с коллекциями очень неплохо.. на миллионе не пробовал, но на 60000(в 2003 икселе) доли секунды..
Живи и дай жить..
|
|
|
|
09.01.2009 22:52:29
спасибо
|
|
|
|
09.01.2009 23:06:53
В приложенном архиве 3 файла
1) сортировка от Chip Pearson, которую дал Слэн 2) сортировка по методу Шелла с сайта 3) сортировка взятая отсюда По моим результатам 3-й вариант самый быстрый. Если я не прав, поправьте меня. |
|
|
|
09.01.2009 23:56:50
Добрый вечер, Слэн! и всем ;-)
Алгоритмов VBA-сортировки опубликовано достаточно много. Прилагаю небольшой архивчик методов сортировки, когда-то надёрганных из Интернета. Вот здесь хороший ресурс по методам сортировки на нескольких языках программирования: Там же есть и статья по сравнению эффективности алгоритмов сортировки массивов: Только советую творчески отнестись к коду и оценкам, так как из-за универсальности код не оптимизирован. И на VB (VBA) можно получить иные результаты эффективности. Кстати, на этом же сайте приведено множество интересных методов матобработки. Эффективность сортировки сильно зависит от размера массива, типа данных, метода сортировки, компилятора и/или среды программирования. В частности, по моим оценкам, на обработках длинных строк при прочих равных условиях компилятор Borland C++ в 2 … 2.5 раза быстрее компилятора Visual C++. Но и функциями VBA можно написать код, который обрабатывает строки в несколько раз быстрее, чем некоторые другие встроенные VBA-функции, написанные на C(++), если вместо автоматизации по скорости компилятора для конкретной задачи написать более оптимальный код, понимая, где реальные тормоза: memory reallocation, adjusting of addresses etc. Известны также методы сортировки коллекций, но они неэффективны на больших массивах: Впрочем, использование дополнительного индексного массива заслуживает внимания: Индексный массив особенно насущен и для сортировки многомерных массивов. На мой взгляд, в дополнение к использованию индексного массива представляет интерес свопинг не самих переменных, а их адресов с помощью API CopyMemory (RtlMoveMemory). Подозреваю, что Excel как и поступает, но реальных тестов эффективности этого метода я не проводил. |
|
|
|
10.01.2009 00:10:49
согласен с Павлом, метод с Vbnet самый быстрый - на моем ПК миллион значений обрабытывает за 5 сек, пирсоновский аж 34 секунды.(Не смотрел пока то что выложил ZVI)
|
|
|
|
10.01.2009 00:24:41
метод бинарных деревьев(при прочих равных) - 6,6 секунд однако...
|
|
|
|
10.01.2009 04:49:25
Потестировал я сортировку QuickSort из файла Sort_Routines.xls, которую так полюбил автор этого файла. При тестировании я чуть не умер... лучший результат ... эм вам в миллисекундах сказать или лучше в минутах? )) В общем 252312 мс, на сколько я понимаю, это 4,2 минуты.
Файл прикладываю. На сколько я понимаю, всё-таки самый быстрый пока остаётся 3-й вариант из моего поста post_44028.xls ( так... 5 утра ... надо ложиться спать. Всем споки. |
|
|
|
10.01.2009 05:04:27
По моему посту выше, где я не мог запустить сортировку с методом бинарных деревьев. Я просто неправильно прочитал название аргумента. Надо читать N - размер массива, а я прочитал "размерность массива" - из-за этого не мог запустить процедуру.
В общем, я сегодня потестировал две версия сортировки методом бинарных деревьев. Оба они оказались не самыми лучшими. Или я, может, что-то делаю не так. Как я уже и сказал, пока лучшим остаётся 3-й вариант файла в посте 2 файла с бинарными деревьями выкладываю на вашего тестирования и анализа а я спать, всем споки |
|
|
|
11.01.2009 14:55:37
вот так вот :) спасибо , научили..
осталось чуть-чуть
Живи и дай жить..
|
|
|
|
11.01.2009 15:56:31
или умножение просто быстрее сложения?
Живи и дай жить..
|
||||
|
|
|||