Сортировка перемешиванием на Ассемблере
Сортировка перемешиванием, она же шейкерная или двунаправленная сортировка - оптимизированная разновидность алгоритма пузырьковой сортировки. В процессе сортировки выполняется многократный проход по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. Массив просматривается поочередно справа налево и слева направо, из-за этого алгоритм получил свое название. В результате каждого прогона крупные и мелкие элементы массива поочередно перемещаются в конец и начало массива соответственно. Границы рабочей части массива, то есть той части массива, где происходит движение, устанавливаются в месте последнего обмена на каждой итерации.Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------
- ; Функция сортировки массива DWORD перемешиванием
- ; by ManHunter / PCL (www.manhunter.ru)
- ;----------------------------------------------------------------
- ; Параметры:
- ; lpArray - указатель на массив DWORD
- ; dLen - количество элементов в массиве
- ;----------------------------------------------------------------
- proc shaker_sort lpArray:DWORD, dLen:DWORD
- pusha
- mov esi,[lpArray]
- ; left
- mov eax,1
- ; right
- mov ebx,[dLen]
- cmp ebx,2
- jb .loc_ret
- dec ebx
- .loc_loop_main:
- ; swap_flag = false
- xor edi,edi
- mov ecx,eax
- .loc_loop_1:
- cmp ecx,ebx
- ja .loc_done_1
- mov edx,dword [esi+ecx*4-4]
- cmp dword [esi+ecx*4],edx
- ; Для сортировки по возрастанию заменить на ja
- jna @f
- push dword [esi+ecx*4-4]
- push dword [esi+ecx*4]
- pop dword [esi+ecx*4-4]
- pop dword [esi+ecx*4]
- ; swap_flag = true
- inc edi
- @@:
- inc ecx
- jmp .loc_loop_1
- .loc_done_1:
- dec ebx
- mov ecx,ebx
- .loc_loop_2:
- cmp ecx,eax
- jb .loc_done_2
- mov edx,dword [esi+ecx*4]
- cmp dword [esi+ecx*4-4],edx
- ; Для сортировки по возрастанию заменить на jb
- jnb @f
- push dword [esi+ecx*4-4]
- push dword [esi+ecx*4]
- pop dword [esi+ecx*4-4]
- pop dword [esi+ecx*4]
- ; swap_flag = true
- inc edi
- @@:
- dec ecx
- jmp .loc_loop_2
- .loc_done_2:
- inc eax
- or edi,edi
- jnz .loc_loop_main
- .loc_ret:
- popa
- ret
- endp
В приложении пример программы с исходным текстом, которая сортирует массив DWORD'ов методом перемешивания.
Просмотров: 256 | Комментариев: 7
Метки: Assembler, полезные функции
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(16.06.2024 в 18:52):
Где бы их еще взять :((( Особенно русскоязычных. Да и зарубежные публикуются или раз в год, или уже мертвые блоги.
user
(16.06.2024 в 01:02):
А можете порекомендовать подобных вам блогеров?
Я имею в виду из русскоязычных. Из англоязычных мне понравился вот этот товарищ - https://blog.demofox.org/ тоже интересный затейник и экспериментатор.
Я имею в виду из русскоязычных. Из англоязычных мне понравился вот этот товарищ - https://blog.demofox.org/ тоже интересный затейник и экспериментатор.
ManHunter
(16.06.2024 в 00:41):
Так у меня весь блог именно для этого. От души и для души.
user
(16.06.2024 в 00:31):
А, ну тогда похвально! Это называется программирование для души :) В наше время программистов, которые экспериментируют/придумывают/изобретают - исчезающе мало.
ManHunter
(15.06.2024 в 17:01):
Ну такими рассуждениями можно быстро добраться до того, что всё для всего уже написано и больше ничего делать не надо. Бери готовые, простигосспадя, фреймворки и библиотеки и не придумывай ничего своего.
QS более чем устраивает, но если в природе есть еще что-то интересное, то почему бы его не покрутить и не повертеть? Хотя бы просто для разминки мозгов.
QS более чем устраивает, но если в природе есть еще что-то интересное, то почему бы его не покрутить и не повертеть? Хотя бы просто для разминки мозгов.
user
(15.06.2024 в 08:39):
А чем Quicksort не устраивает? Рекурсия? Мне для бизнес задач вполне хватает, в экзотических случаях можно подшаманить с размером стека.
Добавить комментарий
Заполните форму для добавления комментария
А на хабре сейчас в основном свои телеграм-каналы рекламируют.