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

Тема в разделе "WASM.BEGINNERS", создана пользователем Loginanton, 9 дек 2009.

  1. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Добрый день. Если не сложно, поделитесь кто-нибудь кодом сортировки (tasm, 16 реальный режим) заданного количества строк, одинаковой длины, по определённой букве. К примеру, дано:

    ФАЫФВА
    ФВФВАУ
    ПВЫЫБС
    БЖЭЭГМ

    Сортируем по предпоследней букве:

    ФВФВАУ
    ПВЫЫБС
    ФАЫФВА
    БЖЭЭГМ
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.900
    Loginanton
    Поиск на сайте рулит. Здесь реализация на MASM (на TASM, 16 переписать не сложно) сортировок: пузырьковой, шейкером, пирамидальной, прямым включением, прямым выбором, Шелла, Хоара (быстрая сортировка) на примере одного и того же массива двойных слов
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Судя по заданию - это лаба и товарищу Loginanton в другую тему :) К лаборанатам.
     
  4. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Собственно сам уже написал :) Если кому то пригодится то вот код:
    Код (Text):
    1. DOSSEG
    2. .model TINY
    3. .data
    4. array db "LOGINOV  A.A.",10,13
    5.       db "OPARIN   P.V.",10,13
    6.       db "ALEKSEEV T.U.",10,13
    7.       db "OSIPOV   P.Y.",10,13
    8.       db "KULKOV   A.X.",10,13
    9.       db "BALASHOV O.U.",10,13
    10.       db "LOGINOV  A.L.",10,13
    11.       db "EMNONOV  S.Y.",10,13
    12.       db "RAKOVICH O.I.",10,13
    13.       db "GON4AROV A.P.",10,13
    14.       db "$"
    15.  
    16. .code
    17.  
    18. ; swap funtion
    19. swap:
    20. pop dx
    21. pop bx ; bx = &array
    22. push dx
    23. mov cx, 15d ; cx = num of loop
    24. for:
    25. push bx
    26. add bx, cx
    27. dec bx
    28. mov al, [bx] ; ax = first word
    29. mov dl, [bx+15d] ; dx = second word
    30. mov [bx], dl
    31. mov [bx+15d], al
    32. pop bx
    33. loop for
    34. ret ; end of swap function
    35.  
    36. start:
    37. mov ax, @code
    38. mov ds, ax
    39.  
    40. mov cx, 9
    41. loop2:
    42. push cx
    43. mov bx, offset array
    44.  
    45. mov cx, 9
    46. loop1:
    47. mov ax, [bx+24]
    48. cmp ax, [bx+9] ; ñðàâíèâàåì ïåðâûå áóêâû â ñòðîêàõ
    49. ja inc_str
    50. push bx
    51. push cx
    52. push bx
    53. call swap
    54. pop cx
    55. pop bx
    56. inc_str:
    57. add bx, 15
    58. loop loop1
    59.  
    60. pop cx
    61. loop loop2
    62.  
    63.  
    64. mov dx, offset array
    65. mov ah, 9h
    66. int 21h
    67. mov ah, 4ch
    68. int 21h
    69.  
    70. end start
     
  5. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    критика принимается :)
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) В CX должно быть число слов, судя по коментарию. Но их вовсе не 15, это вообще-то должен быть параметр. А $ вообще наводит на мысль, что вы ( или автор у которого вы скопипастили) собирался останавливаться по нему, а не по числу.
    2) Непонятная конструкция. Если бы CX не менялся, то BX прыгал бы по начал слов. А так вы будете "косить" влево.
    И
    3) Как я сразу не понял. Вы просто "скоммуниздили" программу перестановки слов, да еще и с двумя ошибками. Она переставляет "по косой" и всего один символ. Для сортировка она нужна, но нужно еще и саму сортировку делать.

    Батенька, чтобы не позорится в следующий раз, используйте translate.ru, раз уж английский не сечете :-Р
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Loginanton
    минимальный код на асме потребует добавить еще один вектор структур, элементами которых будут ссылка на строку и ссылка на некое пожатое представление строки записанное в двордах.
    сортировка будет проходить в 2 этапа
    1) подготовка этих самых "пожатых представление строки записанных в двордах"
    2) сортировка с изменением порядка ссылок.

    даст лог зависимость времени от длины списка
     
  8. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    valterg, моя программа работает более чем корректно, да и написал её полностью сам, готовым кодом не пользовался.
    Что бы не позориться, изобразите в следущий раз, что ассемблер знаете :)
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Приношу извинения, но я не увидел продолжения программы. Перестановка делается правильно, но запрограммировано очень "вычурно" - вот я и запутался. У вас нет единого стиля - при сортировке вы запихали все в оффсет, зачем же делать dec bx в перестановке - зашейте это оффсет.
    В цикле сортировки ошибка. В задании было по определённой букве, а у вас сортируестя по 4-м буквам:
    Код (Text):
    1. mov ax, [bx+24]
    2. cmp ax, [bx+9] ; ñðàâíèâàåì ïåðâûå áóêâû â ñòðîêàõ
    Нужно заменить на al.