Спагетти-сортировка ver.2Она же «Spaghetti sort» ― относится к классу «Параллельных сортировок». Представим массив неотсортиронных чисел в виде пучка из сухих спагетти соответствующей длины. Установим спагетти вертикально на ровной поверхности. Сверху на спагетти опускается пресс, пока не встретится с самой длинной макарониной. Удаляем эту спагеттину и вставляем ее в конец (изначально пустого) массива отсортированных спагетти. Каждый раз, когда пресс касается очередной макаронины, фиксируем очередной отсортированный элемент и удаляем его из массива неотсортированных элементов. Повторяем, пока все спагетти не будут отсортированы. Худшая, средняя и лучшая сложность по времени [math]O(n)[/math] В аттаче asm-/rc-/exe-файлы и курсор
Сортировка вставками. Румынский танец Merge-sort with Transylvanian-saxon (German) folk dance Быстрая сортировка. Венгерский танец
Мой вариант: Объединил все алгоритмы сортировок в одну dll, как и другие вспомогательные функции для работы с массивами. Теперь новые алгоритмы сортировок можно добавлять туда, без необходимости перекомпилировать исходную программу (при условии, что туда заранее импорты будущих сортировок засунуть ). Ну и сделал программку для визуализации на свой вкус, пока выбрать конкретную сортировку нельзя (как и уменьшить задержку между перестановками, сейчас 40мс), всегда сортирует вставками, но скоро добавлю такой функционал. Элементы отображаю с помощью Rect, а не LineTo, но градиент подсмотрел у Mikl___ https://github.com/babasuck/sortVisualisation
Внес некие изменения: 1) Избавился от мерцания формы при сортировке - за счет добавления технологии двойной буферизации. Теперь за отрисовку графики отвечает отдельный поток, который в бесконечном цикле 60 раз в секунду перерисовывает форму с двойным буфером (через CreateCompatibleDC и CreateCompatibleBitmap, а потом копирование во внешний контекст устройства), подсмотрел у Mikl___ и доработал 2) Избавился от утечек памяти (Не удалял кисточки в двух местах, в итоге программа через 3 минуты работы ложилась ) 3) Т.к. теперь форма обновляется отдельным потоком нет смысла запрашивать перерисовку через InvalidateRect, убрал из dll эту функцию в сортировках, теперь она полностью независима от головной программы. https://github.com/babasuck/sortVisualisation
Доделал до конца, убрал границу у элементов, теперь создается красивый градиент после сортировки, добавил еще алгоритмов, по прежнему реализуются в alglib.dll Функционал программы: 1) Визуализация сортировки - ЛКМ 2) Перемешивание массива - ПКМ 3) Выбор алгоритма сортировки - стрелки вправо и влево Алгоритмы: bubble, shaker, insertion, selection, quick, merge
Была ошибка со стеком, исправил. Теперь selection и insertion работает. (Не заметил ошибки, потому что на моем компьютере работало, а на другом нет )
Кстати функцию градиента цвета лучше сделать в виде макроса. Код (ASM): ColorGradientMC MACRO len:req LOCAL bRed,bBlue,bGreen,res ;-----red------------------------------------ IF (len LT 128) ;< ;0..127 bRed = 255-2*len ELSEIF (len LT 224) ;128..223 bRed = 0 ELSEIF (len LT 342) ;224..341 bRed = len - 224 ELSEIF (len LT 374) ;342..373 bRed = 114 ELSEIF (len LT 470) ;374..469 bRed = 114+(len-374) ELSE ;470..511 bRed = 207+(len-470) ENDIF ;----blue------------------------------------- IF (len LT 64) ;0..63 bBlue = 0 ELSEIF (len LT 128) ;64..127 bBlue = 2*(len-64) ELSEIF (len LT 160) ;128..159 bBlue = 128+(len-128) ELSEIF (len LT 192) ;160..191 bBlue = 159+(len-160) ELSEIF (len LT 224) ;192..223 bBlue = 190+(len-192) ELSEIF (len LT 256) ;224..255 ;;sub len, 224 bBlue = 221 ELSEIF (len LT 288) ;256..287 bBlue = 221-(len-256) ELSEIF (len LT 310) ;288..309 bBlue = 190-(len-288) ELSEIF (len LT 342) ;310..341 bBlue = 169-(len-310) ELSEIF (len LT 374) ;342..373 bBlue = 138-(len-342) ELSEIF (len LT 406) ;374..405 bBlue = 107-(len-374) ELSEIF (len LT 438) ;406..437 bBlue = 76-(len-406) ELSEIF (len LT 470) ;438..469 bBlue = 45-(len-438) ELSE ;470..511 bBlue = (14-(len AND 0FFh)) AND 0FFh ENDIF ;---green--------------------------------- IF (len LT 64) ;0..63 bGreen = 128+2*len ELSEIF (len LT 96) ;64..95 bGreen = 255 ELSEIF (len LT 128) ;96..127 bGreen = 255-2*(len-96) ELSEIF (len LT 310) ;128..309 bGreen = 192-(len-128) ELSE ;310..511 bGreen = 0 ENDIF res = bRed + (bGreen SHL 8) + (bBlue SHL 16) EXITM <res> ENDM И ещё один макрос для инициализации таблицы. Код (ASM): InitTable MACRO name_tbl:req, count:req LOCAL i i = 0 name_tbl dword ColorGradientMC(i) WHILE (i LT count) dword ColorGradientMC(i) i = i + 1 ENDM ENDM И ещё в секции данных: InitTable tblColorGradient, 512 Так проще менять градиент, или если переводить код на С/С++.