回 帖 发 新 帖 刷新版面

主题:[讨论]三个连续存放的正整数按递增次序排序

BUF DB 8,2,5
       :
       :
     MOV SI,OFFSET BUF
     MOV AL,[SI]
     CMP AL,[SI+1]
     JBE NEXT
     XCHG AL,[SI+1]
     MOV [SI],AL
NEXT:MOV AL,[SI+1]
     CMP AL,[SI+2]
     JBE EXIT
     XCHG AL,[SI+2]
     MOV [SI+1],AL
     EXIT:RET
我觉得应该比较3次,但上述程序怎样循环都只有2次,我理解错了吗?

回复列表 (共6个回复)

沙发

你理解得没错。本程序的作者不知是否假定最小的数肯定在前面两个数中,如果是这样的话,确实两次就够了。

板凳

十分感谢。还是在同一本书上同一个题目:把三个连续存放的正整数按递增次序存放在原来的三个存储单元中。
DATA  SEGMENT
      INTEGER DB8,3,5
DATA  ENDS
CODE  SEGMENT
      ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
       MOV DS,AX
       LEA SI,INTEGER
       MOV CX,2
REPRAT:MOV AL,[SI]
        CMP AL,[SI+1]
        JB NEXT
        XCHG AL,[SI+1]
        MOV [SI],AL
NEXT:  INC SI
        LOOP REPEAT
        MOV AH,4CH
        INT 21H
CODE    ENDS
        END START
也是循环两次,是吧?
那末适用所有情况的三个连续存放的正整数的程序应该怎么编?
感谢所有回答者。

3 楼


大家帮帮忙

4 楼

呵呵,可以自己去看书或是看下资料嘛,一些常用的排序方法。

5 楼

回答2楼的
是2次循环,但如果最小数在第3个位置(最后面)就不能达到排序目的。

要实现对一般情况下的排序要用到双重循环,外循环和内循环都循环2次(就是冒泡发)。

6 楼


比较换位法:
        LEA BX,DAT
       MOV AL,[BX]
       CMP AL,[BX+1]
       JC NEXT1
       XCHG AL,[BX+1]
       MOV [BX],AL
NEXT1:CMP AL,[BX+2]
        JC NEXT2
        XCHG AL,[BX+2]
        MOV [BX],AL
NEXT2:INC BX
       MOV AL,[BX]
       CMP AL,[BX+1]
       JC DONE
       XCHG AL,[BX+1]
       MOV [BX],AL
DONE:HLT

我来回复

您尚未登录,请登录后再回复。点此登录或注册