Сортировки с анимацией

Тема в разделе "WASM.X64", создана пользователем Mikl___, 24 дек 2022.

  1. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    153
    Не нужно править! Например в этом издании стр 528 .pdf написано "Бинарный цифровой поиск"
    Это побитовое, а не простое больше \ меньше - кол-во проверок при поиске не больше логарифма от двоичной длины.
    D_Knut_-_Iskusstvo_Programmirovania_tom_3.pdf
    https://vk.com/wall-54530371_28
    --- Сообщение объединено, 11 янв 2023 ---
    Не правильно написал - проверок не больше чем кол-во бит.
     
    Последнее редактирование: 11 янв 2023
  2. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    601
    В общем, это... сделал этот код. За пару дней сварганил, на скорость пока не тестировал, но пафосно назвал, "быстрая сортировка строк". Это... спустя 20 лет, тогда у меня вроде только МК-61 был, или уже не было, не помню. Код работает и вроде без ошибок, но пока не оптимизировал, зависимость по по дополнительной памяти ListSize и ещё стека немного.
    --- Сообщение объединено, 11 янв 2023 ---
    Во, ещё мужик развлекается с анимацией сортировок!!!

    Можно взять некоторые идеи, например столбики сделать более узкими и задать волнообразную случайность, думаю на ассме не проблема сделать.
     
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    601
    В общем, протестировал скорость своей сортировки, на 10'000'000 строк, длиной от 1 до 25, мой ПК управился за 2.7 сек. Тест quicksort 10'000'000 dword'ов показал 0.744 сек. Но сами понимаете, одно дело очень быстрые dword'ы, а другое дело строки, там strcmp горазда медленней проверяет строку, u32 за один такт проверяется и пересылается, ну за два, а строка длиной от 1 до 25 думаю 5-15 тактов, или больше. Это значит так сбылась мечта детства, придумать быструю сортировку. НО это всё фигня, надо проверять с другими сортировок строк, правильно проверять.
     
    mantissa нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Битонная сортировка, версия 2.0



    Переделал битонную сортировку
    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

    • BitonicSort.zip
      Размер файла:
      9,4 КБ
      Просмотров:
      149
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    601
    В общем, известный в узких кругах файл 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.
    В принципе, алгоритм элементарный, не трудно додуматься даже школьнику.
     

    Вложения:

  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Поразрядная сортировка (Least Significant Digit)

    Radix-LSD-Sort0.gif
    Поразрядная сортировка (radix LSD sort) — алгоритм сортировки, который выполняется за линейное время относится к классу «сортировок распределением».
    Двигаемся от младших разрядов к старшим и на каждой итерации распределяем элементы массива в зависимости от того, какая цифра содержится в разряде.
    После очередного распределения возвращаем элементы в основной массив в том порядке, в котором элементы попали в классы при очередном перераспределении.

    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

    Rel и Intro нравится это.
  7. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    456
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Оптимизированная гномья сортировка

    5Rgk.gif
    «Оптимизированная гномья сортировка» ― относится к классу «сортировок обменом». Сложность сортировки в лучшем случае [math]O(n)[/math], в среднем и худшем [math]O(n^{2})[/math].
    В обычной гномьей сортировке происходит просмотр от начала к концу массива, при этом соседние элементы сравниваются и меняются, если пара неотсортированна. Если произошел обмен элементов, тогда обмен может породить новую пару, стоящую в неправильном порядке, поэтому происходит возвращение на один шаг назад. Если обмена не происходит ― продолжается просмотр в сторону начала массива в поиске неотсортированных пар. Оптимизация заключается в том, что при обмене запоминается позиция в массиве, на которой этот обмен произошел. При нескольких обменах подряд приходится делать столько же шагов назад. Затем в неоптимизированной гномьей сортировке приходится возвращаться обратно в начало массива, сравнивая по пути элементы, которые и так упорядочены друг относительно друга. Если запомнить позицию, с которой начались обмены, тогда можно мгновенно вернуться в эту позицию, когда обмены при движении в сторону начала массива перестают встречаться.

    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

    Application нравится это.
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793
    сложность по временисложность
    по памяти​
    лучшаясредняяхудшаяобщаядопол-
    нительная​
    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 Sort​
    5Odd-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 Sort​
    27Shell 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 Sort​
    34Lazy
    Stable Sort​
    35Rotate
    Merge Sort​
    36Counting
    Sort​
    [math]O(n+k)[/math][math]O(n+k)[/math][math]O(n+k)[/math]
    37Pigeonhole
    Sort​
    38Gravity
    (Bead) Sort​
    39American
    Flag Sort​
    40Least
    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 Sort​
    43Flash Sort
    44Iterative
    Binary
    Quick Sort​
    45Recursive
    Binary
    Quick Sort​
    46Shatter Sort
    47Simple
    Shatter Sort​
    48Time Sort
    Mul 10​
    49Batcher's
    Bitonic Sort​
    50Batcher's
    Odd-Event
    Merge Sort​
    51Recursive
    Pairwise
    Sorting
    Network​
    52Iterative
    Bitonic
    Sort​
    53Iterative
    Odd-Even
    Merge Sort​
    54Iterative
    Pairwise
    Sorting Network​
    55Hybrid
    Comb Sort​
    56Introspective
    Circle Sort​
    57Binary
    Merge Sort​
    58Weave
    Merge Sort​
    59TimSort[math]O(n)[/math][math]O(n\cdot log_{2}(n))[/math][math]O(n\cdot log_{2}(n))[/math]
    60Cocktail
    Merge Sort​
    61Wikisort
    62Grail Sort
    (Block
    Merge Sort)​
    63Sqrtsort
    64Introspective
    Sort (std::sort)​
    65Opimized
    Bottom-Up
    Merge Sort​
    66Opimized
    Dual-Pivot
    Quick Sort
    (Array Sort)​
    67Pattern-
    Defeating
    Quick Sort​
    68Branchless
    Pattern-
    Defeating
    Quick Sort​
    69Pancake Sort
    70Bad Sort
    71Stooge Sort
    72Silly Sort
    73Slow Sort
    74Exchange
    Bogo Sort​
    75Bubble
    Bogo Sort​
    76Less Bogo Sort
    77Cocktail
    Bogo Sort​
    78Bogo
    Bogo Sort​
    79Bogo Sort
    80Tree 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]
     
    alex_dz и mantissa нравится это.
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Медленная сортировка

    MultWeekend_Disney_pic_07.jpg
    Она же «вялая сортировка», она же «Slow Sort» ― относится к классу «сортировок обменом». Сложность сортировки в лучшем, среднем и худшем случае [math]O(n^{\left(\frac{\displaystyle log_{2}(n)}{\displaystyle 2+\varepsilon}\right)})[/math]
    1. Если массив состоит из одного элемента ― завершаем рекурсию.
    2. Если массив состоит из двух и более элементов ― делим его пополам.
    3. Применяем рекурсивно алгоритм к левой половине массива.
    4. Применяем рекурсивно алгоритм к правой половине массива.
    5. Сравниваются элементы на концах массива (и меняются при необходимости).
    6. Рекурсивно применяем алгоритм к подмассиву без последнего элемента.
    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

    • SlowSort.zip
      Размер файла:
      9,1 КБ
      Просмотров:
      133
    Последнее редактирование: 17 май 2023
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Оптимизированная пузырьковая сортировка

    Упорядочивание происходит в результате обхода массива с конца в начало, по пути происходит обмен местами у неотсортированных соседних элементов. В результате первого прохода в начало массива «всплывет» минимальный элемент. Во время движения находим максимальный элемент и меняем его с тем элементом, который находится в конце массива. Снова обходим массив от предпоследнего элемента ко второму и меняем по пути неотсортированные соседние элементы. По сути получили сортировку шейкером, когда массив заполняется за один проход с противоположных сторон максимальными и минимальными элементами. Введение флажка обменов помогает уменьшить число проходов по массиву. Перед каждым проходом флажок сбрасывается в 0, а после произошедшего обмена устанавливается в 1. Если после выхода из внутреннего цикла флажок равен 0, это означает, что обменов не было ― массив отсортирован и можно досрочно завершить сортировку.

    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

  12. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    601
    Вот, добавил пока ещё одну сортировку BasketSortNB. Но зато свою версию, да, это то, что я сделал ещё 20 лет назад, и теперь в демке.
    Макропеременную BITS_IN_BYTE можно менять от 2 до 8, хотя можно задать и 1. Сейчас 8. Ещё тут, basket_sort_uint(pArray, edi, 1, ebx) надо задать начальное положение нашего слова, ну то есть байта.
    Сортировка относится и radix и к basket, использует дополнительный массив bool'ов, от которого в принципе можно избавится. Высокая скорость сортировки строк. На хабре одни гений создал ещё более быструю версию, но там сложный код, да ещё с метками.
     

    Вложения:

    Mikl___ нравится это.
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793
    Intro,
    у вас 3.ShakerSort и 15.CocktailSort, но ведь это одно и то же? :scratch_one-s_head:И почему в CocktailSort каждый раз продолжается движение в самый конец к [math](n-1)[/math]-му элементу и в самое начало к [math]0[/math]-му элементу, ведь участки в начале и конце массива уже отсортированы? Получается, что ShakerSort это оптимизированная сортировка CocktailSort?
     
  14. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    601
    Mikl___, я сначала копировал твой код, а потом с роззеты и хабра, мог что-то продублировать, я особо не разбирал код, а так да, алгоритм схожий, как у всех пузырьковых. Потом придётся всё рефакторить и сортировать сортировки. И ещё, не заметил ошибку сразу, если у нас рекурсия, то индекс надо не от текущего участка сортировки делать, а от начала. Я у квика ошибку исправил, но есть другие сортировки с рекурсией, и там проверка(comp) подсвечивается не правильно.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Оптимизированная шейкерная сортировка

    Производятся многократные проходы по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. При достижении конца массива направление меняется на противоположное. Первый проход движемся от [math]n[/math]-ого элемента к 1-му элементу. Во время движения в начало массива находим максимальный элемент и меняем его с [math]n[/math]-ым элементом, при этом минимальный элемент выталкивается на место 1-го элемента массива. Второй проход во время движения от 2-го элемента массива к ([math]n[/math]-1)-му элементу находим минимальный элемент и меняем его со 2-ым элементом. Одновременно, при движении по массиву, максимальный элемент выталкивается в ([math]n[/math]-1)-ый элемент массива. Таким образом во время одного прохода происходит заполнение максимальным и минимальным элементами конца и начала массива. Так как в начале и конце массива элементы полностью отсортированы, поэтому каждый раз проход от начального к конечному элементу становится на два элемента короче.

    В аттаче asm-/rc-/exe-файлы и курсор
     

    Вложения:

  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Сортировка Таноса

    Она же «Русская сортировка половинами» (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-файлы и курсор
     

    Вложения:

    • ThanosSort.zip
      Размер файла:
      9,2 КБ
      Просмотров:
      131
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Корзиная сортировка с рекурсией

    Она же «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-файлы и курсор
     

    Вложения:

    • BucketSort.zip
      Размер файла:
      9,3 КБ
      Просмотров:
      119
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793

    Классическая сортировка корзинами

    Относится к классу «сортировок распределением». Сложность сортировки в лучшем случае [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-файлы и курсор
     

    Вложения:

    • BucketSort.zip
      Размер файла:
      9,8 КБ
      Просмотров:
      144
  19. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    456
    а сколько всего типов сортировок известно?
    --- Сообщение объединено, 22 янв 2023 ---
    Mikl___
    в вашем последнем архиве ресурс файл .rc странно забит уймищей 0x00

    upload_2023-1-22_12-16-45.png

    в чем задумка?
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.793
    таблица с названиями сортировок
    упс :scratch_one-s_head:65434 байта, хотя должно быть байт 200 максимум. Ей богу! Эксперименты не проводил...