
Сортировка перемешиванием на Ассемблере
26.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сортировка перемешиванием, она же шейкерная или двунаправленная сортировка - оптимизированная разновидность алгоритма пузырьковой сортировки. В процессе сортировки выполняется многократный проход по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. Массив просматривается поочередно справа налево и слева направо, из-за этого алгоритм получил свое название. В результате каждого прогона крупные и мелкие элементы массива поочередно перемещаются в конец и начало массива соответственно. Границы рабочей части массива, то есть той части массива, где происходит движение, устанавливаются в месте последнего обмена на каждой итерации.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
Читать статью целиком »
Просмотров: 349 | Комментариев: 7
