Сортировка вставками

Тема в разделе "WASM.BEGINNERS", создана пользователем lcrowl, 20 мар 2007.

  1. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    В общем, читаю хайда. В Programming projects нужно написать простую программу, которая сортирует слова в памяти с 1000h до 10ffh в возрастающем порядке. Написано также, что "вы можете использовать простой алгоритм сортировки вставками". Дальше приведен этот алгоритм на паскале. Вроде разобрался, перевел на асм(асм специфический, надо сказать: можно использовать набор регистров и способы адресации 8086). Но есть одна проблемка.
    Для начала кусок кода, который собственно сортирует:

    Код (Text):
    1.         mov bx,1000h
    2.         mov bp,1002h
    3. a:     mov dx,ds:[bx]
    4.         cmp dx,ds:[bp]
    5.         ja  m
    6.         add bp,2
    7.         cmp bp,10ffh
    8.         jae l
    9.         jmp a
    10. l:      cmp bx,10fdh
    11.         jae e
    12.         add bx,2
    13.         mov bp,bx
    14.         add bp,2
    15.         jmp a
    16. m:     mov ax,ds:[bx]
    17.         mov dx,ds:[bp]
    18.         mov ds:[bx],dx
    19.         mov ds:[bp],ax
    20.         add bp,2
    21.         cmp bp,10ffh
    22.         jae l
    23.         jmp a
    24. e:                            ;дальше типа вывод рез-та и выход
    Чувствуется, что код не великолепный ;), но все таки он работает. С одной ошибкой.
    А именно: последнее слово(самое большое) из уже отсортированной последовательности встает почему то не на 10feh, как положено, а на 1100h. А на 10feh - нули. Если кому непонятно - аттач. Before.lst - содержимое памяти до сортировки, after.lst - после.
    Подскажите, что не так. Ну и, если можете, покажите плз как этот код должен выглядеть в нормальном виде =)), потому что чувстую, что с джампами переборщил, да и вообще.. В общем оптимизированный по скорости хотелось бы. Знаю, что этот алгоритм мягко говоря не самый лучший из сортировок, но пока его хотелось бы так скажем добить.
    Ладно, чо то заболтался :).
    Напоследок модерам: я подумал, что теме место все таки в Beginners. Хотите - кидайте в A&O.
     
  2. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    ладно, задачу ставлю по другому: приведите плз рабочую реализацию этого алгоритма. Без разницы - масм, фасм, самое главное чтобы правильно сортировал ворды в памяти. А я уж там разберусь где у меня ошибка.
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    lcrowl
    Лучше отладчиком пользоваться научись.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Потому, что нужно cmp bx,10feh
    И вообще все делается проще и нагляднее
    Код (Text):
    1.         mov bx,1000h
    2. a:
    3.         mov ax,ds:[bx]
    4.         lea bp,[bx+2]
    5. b:    
    6.         mov dx,ds:[bp]
    7.         cmp dx,ax
    8.         jae  c
    9.         mov ds:[bp],ax
    10.         mov ds:[bx],dx
    11.         mov ax,dx
    12. c:
    13.         add bp,2
    14.         cmp bp,1100h
    15.         jb  b
    16.  
    17.         add bx,2
    18.         cmp bx,1100h-2
    19.         jb a
     
  5. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    leo
    Спасибо, сейчас проверю.

    2asd
    Иногда лучше молчать, чем говорить
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Правда?
     
  7. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    asd
    Ага. Вот я, например, не знаю как в CodeView можно было перейти на место перед началом сортировки элемента по адресу 10feh(или хотя бы 10fdh). Т.е. перед моментом сортировки элемента, с которым и была проблема. Может ты подскажешь?
     
  8. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    Не хочу здесь никого огорчать, но два выше приведенные алгоритма на сортировку вставкой ну не как не тянут, на сортировку выбором - да. Я на полчаса в транс вошел пытаясь понять как тут же вставки происходят :).
     
  9. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    CodeTao
    :))
    Хмм, тогда интересно как insertion sort algorithm переводится? ;)
    Дословное задание из книги: Write a simple program that sorts the words in memory locations 1000..10FF in ascending order. You can use a simple insertion sort algorithm. The Pascal code for such a sort is

    Код (Text):
    1.  
    2. for i:=0 to n-1 do
    3.       for j:=i+1 to n do
    4.                 if (memory[i] > memory[j]) then
    5.                 begin
    6.                              temp:=memory[i];
    7.                              memory[i]:=memory[j];
    8.                              memory[j]:=temp;
    9.                 end;
     
  10. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    lcrowl

    Не могу сказать, как переводится, но этот алгоритм принято называть selection (а не insertion) sort.
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    lcrowl
    Есть и тот и другой:
    selection sort - сортировка методом выбора
    insertion sort - сортировка методом вставок
     
  12. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    Да, видно Хайд погнал. Сейчас на вики нашел страницы с реализациями insertion sort и selection sort. Код Хайда больше похож на сортировку выбором(http://ru.wikipedia.org/wiki/Сортировка_методом_выбора#Pascal).

    ЗЫ. А как название темы поменять? ;)
    Модераторы, исправьте плз название темы, а то как то нехорошо получается. Название одно, говорим про другое.
     
  13. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2006
    Сообщения:
    91
    lcrowl
    Обычная сортировка выбором (selection),
    Только наверное:
    Код (Text):
    1. for j := i + 1 to n do
     
  14. lcrowl

    lcrowl New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    72
    Да, опечатался