Не нужно править! Например в этом издании стр 528 .pdf написано "Бинарный цифровой поиск" Это побитовое, а не простое больше \ меньше - кол-во проверок при поиске не больше логарифма от двоичной длины. D_Knut_-_Iskusstvo_Programmirovania_tom_3.pdf https://vk.com/wall-54530371_28 --- Сообщение объединено, 11 янв 2023 --- Не правильно написал - проверок не больше чем кол-во бит.
В общем, это... сделал этот код. За пару дней сварганил, на скорость пока не тестировал, но пафосно назвал, "быстрая сортировка строк". Это... спустя 20 лет, тогда у меня вроде только МК-61 был, или уже не было, не помню. Код работает и вроде без ошибок, но пока не оптимизировал, зависимость по по дополнительной памяти ListSize и ещё стека немного. --- Сообщение объединено, 11 янв 2023 --- Во, ещё мужик развлекается с анимацией сортировок!!! Можно взять некоторые идеи, например столбики сделать более узкими и задать волнообразную случайность, думаю на ассме не проблема сделать.
В общем, протестировал скорость своей сортировки, на 10'000'000 строк, длиной от 1 до 25, мой ПК управился за 2.7 сек. Тест quicksort 10'000'000 dword'ов показал 0.744 сек. Но сами понимаете, одно дело очень быстрые dword'ы, а другое дело строки, там strcmp горазда медленней проверяет строку, u32 за один такт проверяется и пересылается, ну за два, а строка длиной от 1 до 25 думаю 5-15 тактов, или больше. Это значит так сбылась мечта детства, придумать быструю сортировку. НО это всё фигня, надо проверять с другими сортировок строк, правильно проверять.
В общем, известный в узких кругах файл leipzig1M.txt размер 123 МБ, кол. строк 1000000, мой ПК отсортировал за 0.8 сек, а ноутбук за 2.5 сек. ПК Райзен 5 3600Х, а ноутбук T4300,DDR2-800 4GB https://ark.intel.com/content/www/r...ssor-t4300-1m-cache-2-10-ghz-800-mhz-fsb.html Небыстрый конечно, да старый камень, но он это сделал за 2.5 сек. А вот у других..., вот тесты. https://stackoverflow.com/questions/6972635/efficient-string-sorting-algorithm Самое быстрое за 3.74214 сек, но вот не указан какой процессор. А ещё можно приспособить для сортировки целых, можно считать их строками по 4 или 8 байт. И ещё, в демку тоже можно засунуть. --- Сообщение объединено, 13 янв 2023 --- Вот нотариально заверенный скриншот (с). --- Сообщение объединено, 13 янв 2023 --- Нашёл похожий алгоритм на хабре. https://habr.com/ru/post/280848/ Может отличатся способ обмена, а так очень похоже, так что получается, я изобрёл 20 лет назад вариант BasketSort. В принципе, алгоритм элементарный, не трудно додуматься даже школьнику.
Поразрядная сортировка (Least Significant Digit) Поразрядная сортировка (radix LSD sort) — алгоритм сортировки, который выполняется за линейное время ― относится к классу «сортировок распределением». Двигаемся от младших разрядов к старшим и на каждой итерации распределяем элементы массива в зависимости от того, какая цифра содержится в разряде. После очередного распределения возвращаем элементы в основной массив в том порядке, в котором элементы попали в классы при очередном перераспределении. В аттаче asm-/rc-/exe-файлы и курсор
Оптимизированная гномья сортировка «Оптимизированная гномья сортировка» ― относится к классу «сортировок обменом». Сложность сортировки в лучшем случае [math]O(n)[/math], в среднем и худшем [math]O(n^{2})[/math]. В обычной гномьей сортировке происходит просмотр от начала к концу массива, при этом соседние элементы сравниваются и меняются, если пара неотсортированна. Если произошел обмен элементов, тогда обмен может породить новую пару, стоящую в неправильном порядке, поэтому происходит возвращение на один шаг назад. Если обмена не происходит ― продолжается просмотр в сторону начала массива в поиске неотсортированных пар. Оптимизация заключается в том, что при обмене запоминается позиция в массиве, на которой этот обмен произошел. При нескольких обменах подряд приходится делать столько же шагов назад. Затем в неоптимизированной гномьей сортировке приходится возвращаться обратно в начало массива, сравнивая по пути элементы, которые и так упорядочены друг относительно друга. Если запомнить позицию, с которой начались обмены, тогда можно мгновенно вернуться в эту позицию, когда обмены при движении в сторону начала массива перестают встречаться. В аттаче asm-/rc-/exe-файлы и курсор
сложность по временисложность по памятилучшаясредняяхудшаяобщаядопол- нительная1Bubble Sort[math]O(n)[/math][math]O(\frac{n\cdot(n-1)}{1,33})[/math][math]O(n^{2})[/math][math]O(n)[/math][math]O(1)[/math]2Optimized Bubble Sort[math]O(n)[/math][math]O(\frac{n\cdot(n-1)}{2,28})[/math][math]O(n^2)[/math][math]O(n)[/math][math]O(1)[/math]3Cocktail Sort[math]O(n)[/math][math]O(n^2)[/math][math]O(n^2)[/math]4Optimized Cocktail Sort5Odd-even sort[math]O(n)[/math][math]O(n^2)[/math][math]O(n^2)[/math][math]O(n)[/math][math]O(1)[/math]6Gnom sort[math]O(n)[/math][math]O(n^2)[/math][math]O(n^2)[/math][math]O(n)[/math][math]O(1)[/math]7Optimized Gnom sort[math]O(n)[/math][math]O(n^2)[/math][math]O(n^2)[/math][math]O(n)[/math][math]O(1)[/math]8Optmized Gnom sort Binary Seach[math]O(n)[/math][math]O(n^2)[/math][math]O(n^2)[/math]9Comb Sort[math]O(\frac{n^2}{2^p})[/math][math]O(n)[/math][math]O(n^2)[/math][math]O(n)[/math][math]O(1)[/math]10Cycle sort—[math]O(n^{2})[/math][math]O(n^{2})[/math][math]O(n)[/math][math]O(1)[/math]11Quick Sort Left/ Left Pointers[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]12Quick Sort Left/ Right Pointers[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]13Dual-Pivot Quick Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]14Stable Quick Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]15Selection Sort[math]O(n^{2})[/math][math]O(n^{2})[/math][math]O(n^{2})[/math]16Double Selection Sort[math]O(n^{2})[/math][math]O(n^{2})[/math][math]O(n^{2})[/math]17Max Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]18Min Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]19Flipped Min Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]20Weak Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]21Ternary Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]22Smoothsort[math]O(n)[/math]23Poplar Heap Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]24Tournament sort—25Insertion Sort[math]O(n)[/math][math]O(n^{2})[/math][math]O(n^{2})[/math]26Binary Insertion Sort27Shell Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log^{2}_{2}(n))[/math][math]O(n\cdot log^{2}_{2}(n))[/math][math]O(n)[/math][math]O(1)[/math]28Patience sorting[math]O(n)[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math]29Unbalance Tree Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]30Merge sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n)[/math][math]O(n)[/math]31Button-up Merge sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n)[/math][math]O(n)[/math]32In-Place Merge sort——[math]O(n\cdot log^{2}_{2}(n))[/math]33Andrey Astrelin's In Place Merge Sort34Lazy Stable Sort35Rotate Merge Sort36Counting Sort[math]O(n+k)[/math][math]O(n+k)[/math][math]O(n+k)[/math]37Pigeonhole Sort38Gravity (Bead) Sort39American Flag Sort40Least Significant Digit Radix Sort[math]O(n\cdot k)[/math][math]O(n\cdot k)[/math][math]O(n^{2})[/math]41In-Place LSD Radix Sort[math]O(n\cdot k)[/math][math]O(n\cdot k)[/math][math]O(n^{2})[/math]42Most Significant Digit Radix Sort43Flash Sort44Iterative Binary Quick Sort45Recursive Binary Quick Sort46Shatter Sort47Simple Shatter Sort48Time Sort Mul 1049Batcher's Bitonic Sort50Batcher's Odd-Event Merge Sort51Recursive Pairwise Sorting Network52Iterative Bitonic Sort53Iterative Odd-Even Merge Sort54Iterative Pairwise Sorting Network55Hybrid Comb Sort56Introspective Circle Sort57Binary Merge Sort58Weave Merge Sort59TimSort[math]O(n)[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]60Cocktail Merge Sort61Wikisort62Grail Sort (Block Merge Sort)63Sqrtsort64Introspective Sort (std::sort)65Opimized Bottom-Up Merge Sort66Opimized Dual-Pivot Quick Sort (Array Sort)67Pattern- Defeating Quick Sort68Branchless Pattern- Defeating Quick Sort69Pancake Sort70Bad Sort71Stooge Sort72Silly Sort73Slow Sort74Exchange Bogo Sort75Bubble Bogo Sort76Less Bogo Sort77Cocktail Bogo Sort78Bogo Bogo Sort79Bogo Sort80Tree Sort[math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n^{2})[/math][math]O(n)[/math]81Bucket Sort[math]O(n)[/math][math]O(n+k)[/math][math]O(n^2)[/math][math]O(n\cdot k)[/math]
Медленная сортировка Она же «вялая сортировка», она же «Slow Sort» ― относится к классу «сортировок обменом». Сложность сортировки в лучшем, среднем и худшем случае [math]O(n^{\left(\frac{\displaystyle log_{2}(n)}{\displaystyle 2+\varepsilon}\right)})[/math] Если массив состоит из одного элемента ― завершаем рекурсию. Если массив состоит из двух и более элементов ― делим его пополам. Применяем рекурсивно алгоритм к левой половине массива. Применяем рекурсивно алгоритм к правой половине массива. Сравниваются элементы на концах массива (и меняются при необходимости). Рекурсивно применяем алгоритм к подмассиву без последнего элемента. В аттаче asm-/rc-/exe-файлы и курсор
Оптимизированная пузырьковая сортировкаУпорядочивание происходит в результате обхода массива с конца в начало, по пути происходит обмен местами у неотсортированных соседних элементов. В результате первого прохода в начало массива «всплывет» минимальный элемент. Во время движения находим максимальный элемент и меняем его с тем элементом, который находится в конце массива. Снова обходим массив от предпоследнего элемента ко второму и меняем по пути неотсортированные соседние элементы. По сути получили сортировку шейкером, когда массив заполняется за один проход с противоположных сторон максимальными и минимальными элементами. Введение флажка обменов помогает уменьшить число проходов по массиву. Перед каждым проходом флажок сбрасывается в 0, а после произошедшего обмена устанавливается в 1. Если после выхода из внутреннего цикла флажок равен 0, это означает, что обменов не было ― массив отсортирован и можно досрочно завершить сортировку. В аттаче asm-/rc-/exe-файлы и курсор
Вот, добавил пока ещё одну сортировку BasketSortNB. Но зато свою версию, да, это то, что я сделал ещё 20 лет назад, и теперь в демке. Макропеременную BITS_IN_BYTE можно менять от 2 до 8, хотя можно задать и 1. Сейчас 8. Ещё тут, basket_sort_uint(pArray, edi, 1, ebx) надо задать начальное положение нашего слова, ну то есть байта. Сортировка относится и radix и к basket, использует дополнительный массив bool'ов, от которого в принципе можно избавится. Высокая скорость сортировки строк. На хабре одни гений создал ещё более быструю версию, но там сложный код, да ещё с метками.
Intro, у вас 3.ShakerSort и 15.CocktailSort, но ведь это одно и то же? И почему в CocktailSort каждый раз продолжается движение в самый конец к [math](n-1)[/math]-му элементу и в самое начало к [math]0[/math]-му элементу, ведь участки в начале и конце массива уже отсортированы? Получается, что ShakerSort это оптимизированная сортировка CocktailSort?
Mikl___, я сначала копировал твой код, а потом с роззеты и хабра, мог что-то продублировать, я особо не разбирал код, а так да, алгоритм схожий, как у всех пузырьковых. Потом придётся всё рефакторить и сортировать сортировки. И ещё, не заметил ошибку сразу, если у нас рекурсия, то индекс надо не от текущего участка сортировки делать, а от начала. Я у квика ошибку исправил, но есть другие сортировки с рекурсией, и там проверка(comp) подсвечивается не правильно.
Оптимизированная шейкерная сортировкаПроизводятся многократные проходы по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. При достижении конца массива направление меняется на противоположное. Первый проход ― движемся от [math]n[/math]-ого элемента к 1-му элементу. Во время движения в начало массива находим максимальный элемент и меняем его с [math]n[/math]-ым элементом, при этом минимальный элемент выталкивается на место 1-го элемента массива. Второй проход ― во время движения от 2-го элемента массива к ([math]n[/math]-1)-му элементу находим минимальный элемент и меняем его со 2-ым элементом. Одновременно, при движении по массиву, максимальный элемент выталкивается в ([math]n[/math]-1)-ый элемент массива. Таким образом во время одного прохода происходит заполнение максимальным и минимальным элементами конца и начала массива. Так как в начале и конце массива элементы полностью отсортированы, поэтому каждый раз проход от начального к конечному элементу становится на два элемента короче. В аттаче asm-/rc-/exe-файлы и курсор
Сортировка ТаносаОна же «Русская сортировка половинами» (Russian sorting halves), она же «Thanos sort», она же «Средне-арифметическая ведерная сортировка» (Average bucket sort) ― относится к классу «сортировок распределением». Сложность сортировки в лучшем случае [math]O(n)[/math], в среднем ― [math]O(n+k)[/math], в худшем ― [math]O(n^{2})[/math] В подмассиве (на первом шаге подмассивом является весь массив) вычисляется среднее арифметическое среди элементов. Затем элементы подмассива сравниваются со средним арифметическим и в зависимости от сравнения отправляются в левую или в правую часть подмассива. Затем те же действия рекурсивно производятся по отдельности с левой и с правой частью подмассива. В аттаче asm-/rc-/exe-файлы и курсор
Корзиная сортировка с рекурсиейОна же «Bucket sort», она же «Карманная сортировка», она же «Ведерная сортировка», она же «Блочная сортировка» ― относится к классу «сортировок распределением». Сложность сортировки в лучшем случае [math]O(n)[/math], в среднем ― [math]O(n+k)[/math], в худшем ― [math]O(n^2)[/math] Основная идея ― распределение элементов по корзинам (блокам, карманам, ведрам), то есть группировка элементов по определенному признаку. Элементы в каждой корзине группируем по уточняющим признакам. Процесс распределения продолжается, пока в каждой корзине не окажутся одинаковые элементы. Для конкретной реализации в массиве отыскивались максимальный и минимальный элементы, затем массив делится на правый и левый подмассив, в которых значения элементов больше или меньше значения [math]\frac{max+min}{2}[/math]. Затем те же действия рекурсивно производятся по отдельности с левой и с правой частью подмассива. Хотя у нас появлялись максимальные и минимальные элементы, которые можно сразу ставить на положенное место в массиве, но это усложняло алгоритм и не давало никакого выигрыша. В аттаче asm-/rc-/exe-файлы и курсор
Классическая сортировка корзинамиОтносится к классу «сортировок распределением». Сложность сортировки в лучшем случае [math]O(n)[/math], в среднем ― [math]O(n+k)[/math], в худшем ― [math]O(n^2)[/math] В массиве элементы со значениями от 1 до 511, то есть каждый элемент кодируется 9 разрядами (29=512). Отведем под сортировку 128 корзин (27=128). В корзине должно быть место под 4 элемента (29-7=4), но возможно, что часть корзин будет пустыми, а в части корзин будет более чем 4 элемента. Заводим массив из 128 счетчиков, обнуляем счетчики, пробегаемся по исходному массиву ― смотрим сколько элементов будет соответствовать 7-разрядному «ключу». Ищем в массиве счетчиков максимум. Выделяем память под корзины из расчета (128 корзин)×[math]max[/math]×(размер элемента в байтах). Заполняем корзины в соответствии с 7-разрядным «ключом», если место на «дне» корзины занято, тогда помещаем элемент в корзину на свободное место. Пробегаем по массиву счетчиков и перемещаем элементы из корзины в исходный массив. Если корзина пуста ― пропускаем ее, если в корзине более одного элемента ― сортируем элементы в корзине и отсортированные элементы отправляем в исходный массив. В аттаче asm-/rc-/exe-файлы и курсор
а сколько всего типов сортировок известно? --- Сообщение объединено, 22 янв 2023 --- Mikl___ в вашем последнем архиве ресурс файл .rc странно забит уймищей 0x00 в чем задумка?
таблица с названиями сортировок упс 65434 байта, хотя должно быть байт 200 максимум. Ей богу! Эксперименты не проводил...