【正确答案】交换排序(冒泡法):
SSEG SEGMENT PARA STACK'STACK'
DB 100DUP(?)
SSEG ENDS
DATA SEGMENT
DAT DB 2,67,33,12,56,89,54,20,98,10
DATA ENDS
CODE SECMENT
ASSUME CS: CODE,DS: DATA,SS: SSEG
STA: MOV AX,DATA
MOV DS,AX
LEA SI,DAT ;置数据区地址指针
MOV CX,10 ;置计数初值
NEXT: MOV DX,CX ;置内循环计数初值
PUSHSI
LP1: MOV AL,[SI]
CMP AL,[SI+1]
JBE LP2
XCHGAL,[SI+1]
MOV [SI],AL
LP2: INC SI ;调整指针
DEC DX ;内循环计数值减1
JNZ LP1 ;未完,转LP1
POP SI
LOOP NEXT ;未完,转NEXT
MOV CX,10
LEA SI,DAT
NXT: MOV AL,[SI]
MOV AH,0
MOV BL,10
DIV BL
MOV DL,AL
MOV DH,AH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,DH
ADD DL,30H
INT 21H
MOV DL,','
INT 21H
INC SI
LOOP NXT
MOV AH,4CH
INT 21H
CODE ENDS
END STA
选择排序:
DATA SEGMENT
DAT DB 2,5,79,12,24.35,98,45,35,96
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE,DS: DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV CX,AX
LEA DI,DAT
MOV CL,10
DEC CX
LP: MOV BX,CX ;置内循环循环次数
MOV SI,D1 ;置内循环开始比较的数据地址
MOV AL,[DI] ;取未排序的第一个数
CALL LK ;调用子程序
MOV [DI],AL ;置已排序数列最大数于队首
INC DI ;调整指针
LOOP LP ;数列未排完则继续
LEA DI,DAT ;否则显示输出
MOV CL,10
SC: MOV AX,0
MOV BH,2
MOV AL,[DI]
MOV BL,10
DIV BL
ADD AX,3030H
MOV DL,AL
MOV DH,AH
MOV AH,02H
INT 21H
MOV DL,DH
INT 21H
MOV DL,','
INT 21H
INC DI
LOOP SC
MOV AH,4CH
INT 21H
LK PROC
LP1: INC SI
CMP AL,[SI] ;比较
JB NEXT ;大于,比较下一个数
XCHGAL,[SI] ;交换
NEXT: DEC BX
JNZ LP1 ;未完,转到LP1
RET ;返回主程序
LK ENDP
CODE ENDS
END START
插入排序:
DATA SEGMENT
DAT DB 2,5,79,12,24,35,98,45,35,96
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE,DS: DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV CX,AX
LEA DI,DAT
MOV CL,10
DEC CX
INC DI
LP: MOV SI,DI
DEC SI
MOV AL,[DI]
PUSHDI
CALL LK
LOOP LP
LEA DI,DAT
MOV CL,10
SC: MOV AX,0
MOV BH,2
MOV AL,[DI]
MOV BL,10
DIV BL
ADD AX,3030H
MOV DL,AL
MOV DH,AH
MOV AH,02H
INT 21H
MOV DL,DH
INT 21H
MOV DL,','
INT 21H
INC DI
LOOP SC
MOV AH,4CH
INT 21H
LK PROC
MOV BL,10
SUB BL,CL
LP1: CMP AL,[SI]
JA RTT
MOV DL,[SI]
MOV [DI],DL
MOV [SI],AL
RTT: DEC SI
DEC DI
DEC CL
JNZ LP1
RET
LK ENDP
CODE ENDS
END START
【答案解析】