Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с массивами. Сортировка массивов.

Второй вариант сортировки прямым обменом

Эту сортировку называют шейкерной (программа prg4_104.asm). Она представляет собой вариант пузырьковой сортировки и предназначена для случая, когда последовательность почти упорядочена. Отличие шейкерной сортировки от пузырьковой в том, что на каждой итерации меняется направление очередного про хода: слева направо, справа налево.

ПРОГРАММА prg4_104
mov mas[si-l].al:mas[j-
mov al,x
//prg4_104 – программа на псевдоязыке сортировки прямым обменом 2 (шейкерной)
 mov mas[si].al;mas[j]:-x
//Вход: mas[n] – неупорядоченная последовательность байтовых двоичных значений .mov k.si:k: = j
//Выход: mas[n] – упорядоченная последовательность байтовых двоичных значений .ml: dec si:j: = j-l
loop cycll
ПЕРЕМЕННЫЕ mov ax.k
INT BYTE n=8: //количество элементов в сортируемом массиве inc ax
INT BYTE mas[n]: //сортируемый массив размерностью п (О..п-l) mov Lax:L: = k+l
INT BYTE X: 1-0; j=0: г=0: 1=0: k=0 // i .j. г. 1 .k – индексы: цикл cycl2:ДЛЯ j: = l ДОВНИЗ
НАЧ_ПРОГ mov si.L:j: = L
1: = 2: r: = n; k: = n mov ax.R
ПОВТОРИТЬ
ДЛЯ j: = r ДОВНИЗ 1 //j изменяется от 1 до г ЕСЛИ mas[j-l]< mas[j] TO НАЧ_БЛОК_1
x: = mas[j-l]: mas[j-l]: = mas[j]: mas[j]: = X: k: = j КОН_БЛОК_1
ДЛЯ j: = l ДОВНИЗ г //j изменяется от г до 1 ЕСЛИ mas[j-l]< mas[j] TO НАЧ_БЛОК_2
x:-mas[j-l]; mas[j-l]: = mas[j]; mas[j]: = X; k: = j К0Н_БЛ0К_2 r: = k-l ПОКА (1>г) КОН_ПРОГ
:prg4_104.asm – программа на ассемблере сортировки прямым выбором 2 (шейкерной).
.data
: задаем массив
masdb 44.55.12.42.94.18.06.67
n=$-mas
X db 0
L dw 1
R dw n
k dw n
.code
;….:1: = 2: r: = n: k: = n
cycl3::ДЛЯ ДОВНИЗ 1
mov si.R:j: = R
push si
sub si.L
mov ex,si количество повторений цикла cycll
pop si
dec si cycll::ЕСЛИ mas[j-l]< mas[j] TO
mov al,mas[si-1]
emp al.mas[si]
jna ml
mov al,mas[si-1]
mov x.al;x: = mas[j-l]
mov al.mas[si]
mov mas[si-l].al:mas[j-l]: = mas[j]
mov a 1, x
mov mas[si].al:mas[j]: = x
mov k.si;k: = j
ml: dec si:j: = j – 1
loop cycll
mov ax.k
inc ax
mov L.ax:L: = k+l: цикл сус12:ДЛЯ j:-l ДОВНИЗ г
mov si.L:j: = L
mov ax.R
sub ax.L
mov ex.ax количество повторений цикла сус12
cyc12: mov al.mas[si-l]:ЕСЛИ mas[j-l]< mas[j] TO
emp al.mas[si]
jna m2
mov al,mas[si-l]
mov x.al;x: = mas[j-l]
mov al.mas[si]
mov mas[si-l].al;mas[j-l]: = mas[j]
mov al.x
mov mas[si].al:mas[j]: = x
mov k.s1:k: = j
m2: inc si:j: = j+l
loop cycl2
mov ax.k
dec ax
mov R.ax:R: = k-1
emp L.ax;L>R – ?
jae $+5
jmp cycl3
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.