Работа с массивами. Сортировка массивов.
Второй вариант сортировки прямым обменом
Эту сортировку называют шейкерной (программа 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