Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2012, 01:32   #1
netfilter
 
Регистрация: 24.11.2012
Сообщений: 3
По умолчанию Шейкерная сортировка

Нашел на форуме следующий код:
Код:
.data
array  dd 10,450,320,120,180,600,50,230,340,460,550,500,130
      dd 80,390,410,20,800,670,60,730,610,310,0,360,200
n = ($-array)/4
H dd 0    ;верхняя граница неотсортированного массива
L dd n-1    ;нижняя граница неотсортированного массива
.code
    xor esi,esi        ;нижняя граница неотсортированного массива
    xor ebx,ebx        ;флаг - были/не были перестановки в проходе
    mov ecx,L;количество неотсортированных элементов снизу минус один
a4:    inc esi
      call Compare_Swapping    ;сравнение и обмен значений элементов
    loop a4                ;двигаемся вниз до границы массива
    dec ebx                ;проверяем были ли перестановки
    jnz exit        ;если перестановок не было - сортировка закончена 
    dec L        ;уменьшаем количество неотсортированных элементов снизу
    jz exit    ;достигли границы массива
    dec esi        ;esi=L
    mov ecx,esi
    sub ecx,H;количество неотсортированных элементов сверху минус один
    jecxz exit    ;если граница снизу равна границе сверху - выходим
a2:    call Compare_Swapping        ;сравнение и обмен значений элементов
    dec esi
    loop a2                ;двигаемся вверх до границы массива
    dec ebx                ;проверяем были ли перестановки
    jnz exit    ;если перестановок не было - заканчиваем сортировку
    inc H    ;уменьшаем количество неотсортированных элементов сверху
    inc esi        ;esi=H
    mov ecx,L    
    sub ecx,esi    ;если граница снизу больше, чем граница сверху – значит 
    ja a4;есть еще неотсортированные элементы - начинаем новый проход
exit:    . . .
Compare_Swapping proc;сравнение и обмен значений соседних элементов
    mov eax,array[esi*4]    ;получаем значение очередного элемента
    cmp array[esi*4-4],eax    ;сравниваем его с соседним элементом
    jna a3    ;если меньше или равен - идем к следующему элементу
    seta bl    ;если была перестановка - взводим флаг
    xchg eax,array[esi*4-4]        ;меняем значения элементов местами
    mov array[esi*4],eax
a3:    ret
Compare_Swapping endp
вопрос в следующем: возможно ли переписать программу так, чтобы в ней не было процедур, в общем без Compare_Swapping?
сам пробовал, но моих знаний на это не хватило..(
netfilter вне форума Ответить с цитированием
Старый 25.11.2012, 09:57   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

netfilter,
можно было и автора и форум, с которого ты взял мою программу указать
Код:
    xor esi,esi        ;нижняя граница неотсортированного массива
    xor ebx,ebx        ;флаг - были/не были перестановки в проходе
    mov ecx,L;количество неотсортированных элементов снизу минус один
a4:    inc esi
       mov eax,array[esi*4]    ;получаем значение очередного элемента
    cmp array[esi*4-4],eax    ;сравниваем его с соседним элементом
    jna a3    ;если меньше или равен - идем к следующему элементу
    seta bl    ;если была перестановка - взводим флаг
    xchg eax,array[esi*4-4]        ;меняем значения элементов местами
    mov array[esi*4],eax
a3: loop a4                ;двигаемся вниз до границы массива
    dec ebx                ;проверяем были ли перестановки
    jnz exit        ;если перестановок не было - сортировка закончена 
    dec L        ;уменьшаем количество неотсортированных элементов снизу
    jz exit    ;достигли границы массива
    dec esi        ;esi=L
    mov ecx,esi
    sub ecx,H;количество неотсортированных элементов сверху минус один
    jecxz exit    ;если граница снизу равна границе сверху - выходим
a2:    mov eax,array[esi*4]    ;получаем значение очередного элемента
    cmp array[esi*4-4],eax    ;сравниваем его с соседним элементом
    jna a1    ;если меньше или равен - идем к следующему элементу
    seta bl    ;если была перестановка - взводим флаг
    xchg eax,array[esi*4-4]        ;меняем значения элементов местами
    mov array[esi*4],eax
a1:     dec esi
    loop a2                ;двигаемся вверх до границы массива
    dec ebx                ;проверяем были ли перестановки
    jnz exit    ;если перестановок не было - заканчиваем сортировку
    inc H    ;уменьшаем количество неотсортированных элементов сверху
    inc esi        ;esi=H
    mov ecx,L    
    sub ecx,esi    ;если граница снизу больше, чем граница сверху – значит 
    ja a4;есть еще неотсортированные элементы - начинаем новый проход
exit:    . . .
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шейкерная сортировка C++ zaki Помощь студентам 2 27.02.2012 17:46
Шейкерная сортировка nelly.nelly Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 06.06.2011 15:03
Шейкерная сортировка Paladast Помощь студентам 2 13.01.2010 16:23
Шейкерная сортировка на С Tat-ka Помощь студентам 0 02.12.2009 21:17
Паскаль: шейкерная сортировка на динамической структуре. kotzebu Фриланс 1 01.05.2009 12:48