;振荡排序
assume cs:code
;初始递增路段(递增字符串)为4个
str1 segment
db 'ai$'
str1 ends
str2 segment
db 'bjtvz$'
str2 ends
str3 segment
db 'lmoqr$'
str3 ends
str4 segment
db 'klo$'
str4 ends
;假设有三条磁带供利用,三条磁带,即外存储介质
T1 segment
db 30 dup(0)
T1 ends
T2 segment
db 30 dup(0)
T2 ends
T3 segment
db 30 dup(0)
T3 ends
;三个磁带的游标
cur segment
db 0 , 0 , 0
cur ends
;控制路段分布到哪个磁带
tape segment
db 1 dup(0)
tape ends
code segment
start:
mov ax , str1
mov ds , ax
call distribute ;分布
mov ax , str2
mov ds , ax
call distribute ;分布
call merge ;合并
mov ax , str3
mov ds , ax
call distribute
mov ax , str4
mov ds , ax
call distribute
call merge
;合并最后两个磁带
mov ax , tape
mov ds , ax
mov byte ptr ds:[0] , 0 ;合并存放在数据的磁带1
mov ax , cur
mov ds , ax
mov byte ptr ds:[1] , 0
mov byte ptr ds:[2] , 0
call merge
mov ax , 4c00H
int 21h
;================================================
;向磁带分布路段,ds路段段地址
distribute:
push es
push ax
push bx
push cx
push di
push ds
mov ax , tape
mov ds , ax
cmp byte ptr ds:[0] , 0
je toT1
cmp byte ptr ds:[0] , 1
je toT2
cmp byte ptr ds:[0] , 2
je toT3
pop ds
jmp disRet
toT1:
pop ds
mov si , 0 ;路段的位置控制量
mov ax , cur
mov es , ax
mov ah , 0
mov al , es:[0]
mov di , ax ;磁带的位置
mov ax , T1
mov es , ax
T1Next:
mov al , ds:[si]
cmp al , '$'
je T1Ret
mov es:[di] , al
add si , 1
add di , 1
jmp T1Next
T1Ret:
mov ax , tape
mov ds , ax
mov byte ptr ds:[0] , 1
jmp disRet
toT2:
pop ds
mov si , 0 ;路段的位置控制
mov ax , cur
mov es , ax
mov ah , 0
mov al , es:[1]
mov di , ax ;磁带的位置
mov ax , T2
mov es , ax
T2Next:
mov al , ds:[si]
cmp al , '$'
je T2Ret
mov es:[di] , al
add si , 1
add di , 1
jmp T2Next
T2Ret:
mov ax , tape
mov ds , ax
mov byte ptr ds:[0] , 2
jmp disRet
toT3:
pop ds
mov si , 0 ;路段的位置控制
mov ax , cur
mov es , ax
mov ah , 0
mov al , es:[2]
mov di , ax ;磁带的位置
mov ax , T3
mov es , ax
T3Next:
mov al , ds:[si]
cmp al , '$'
je T3Ret
mov es:[di] , al
add si , 1
add di , 1
jmp T3Next
T3Ret:
mov ax , tape
mov ds , ax
mov byte ptr ds:[0] , 0
jmp disRet
disRet:
pop es
pop di
pop cx
pop bx
pop ax
ret
;====================================================
;将两个磁带中的路段合并到第三条上
merge:
push ds
push es
push ax
push bx
push cx
push dx
push si
push di
mov ax , tape
mov ds , ax
cmp byte ptr ds:[0] , 0
je mergeT23
cmp byte ptr ds:[0] , 1
jne goM1
jmp mergeT13
goM1:
cmp byte ptr ds:[0] , 2
jne goM2
jmp mergeT12
goM2:
jmp merRet
mergeT23:
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[1]
mov di , bx ;T2的游标值
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[2]
mov si , bx ;T3的游标
T2next1:
mov bx , T2
mov ds , bx
mov ah , ds:[di]
T3next1:
mov bx , T3
mov ds , bx
mov al , ds:[si]
cmp ax , 0 ;看是不是ah,al都为空
jne goM3
jmp merRet
goM3:
cmp ah , 0
je T3toT1
cmp al , 0
je T2toT1
cmp ah , al
jna T2toT1 ;ah大就吧ah放到T1中
T3toT1:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[0]
mov di , bx ;T1的游标位置
mov bx , T1
mov ds , bx
mov ds:[di] , al ;把al放到T1中
mov bx , cur
mov ds , bx
add byte ptr ds:[0] , 1 ;T1的游标位置加1
pop di
mov bx , T3
mov ds , bx
mov byte ptr ds:[si] , 0 ;将T3si位置上的数据清空
add si , 1 ;T3的游标移动一位
jmp T3next1
T2toT1:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[0]
mov di , bx ;T1的游标位置
mov bx , T1
mov ds , bx
mov ds:[di] , ah ;把ah放到T1中
mov bx , cur
mov ds , bx
add byte ptr ds:[0] , 1 ;T1的游标位置加1
pop di
mov bx , T2
mov ds , bx
mov byte ptr ds:[di] , 0 ;将T2di位置上的数据清空
add di , 1 ;T2的游标移动一位
jmp T2next1
mergeT13:
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[0]
mov di , bx ;T1的游标值
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[2]
mov si , bx ;T3的游标
T1next2:
mov bx , T1
mov ds , bx
mov ah , ds:[di]
T3next2:
mov bx , T3
mov ds , bx
mov al , ds:[si]
cmp ax , 0 ;看是不是ah,al都为空
jne goM4
jmp merRet
goM4:
cmp ah , 0
je T3toT2
cmp al , 0
je T1toT2
cmp ah , al
jna T1toT2 ;ah大就吧ah放到T1中
T3toT2:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[1]
mov di , bx ;T2的游标位置
mov bx , T2
mov ds , bx
mov ds:[di] , al ;把al放到T2中
mov bx , cur
mov ds , bx
add byte ptr ds:[1] , 1 ;T2的游标位置加1
pop di
mov bx , T3
mov ds , bx
mov byte ptr ds:[si] , 0 ;将T3si位置上的数据清空
add si , 1 ;T3的游标移动一位
jmp T3next2
T1toT2:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[1]
mov di , bx ;T2的游标位置
mov bx , T2
mov ds , bx
mov ds:[di] , ah ;把ah放到T2中
mov bx , cur
mov ds , bx
add byte ptr ds:[1] , 1 ;T2的游标位置加1
pop di
mov bx , T1
mov ds , bx
mov byte ptr ds:[di] , 0 ;将T1di位置上的数据清空
add di , 1 ;T2的游标移动一位
jmp T1next2
mergeT12:
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[0]
mov di , bx ;T1的游标值
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[1]
mov si , bx ;T2的游标
T1next3:
mov bx , T1
mov ds , bx
mov ah , ds:[di]
T2next3:
mov bx , T2
mov ds , bx
mov al , ds:[si]
cmp ax , 0 ;看是不是ah,al都为空
je merRet
cmp ah , 0
je T2toT3
cmp al , 0
je T1toT3
cmp ah , al
jna T1toT3 ;ah大就吧ah放到T1中
T2toT3:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[2]
mov di , bx ;T3的游标位置
mov bx , T3
mov ds , bx
mov ds:[di] , al ;把al放到T3中
mov bx , cur
mov ds , bx
add byte ptr ds:[2] , 1 ;T3的游标位置加1
pop di
mov bx , T2
mov ds , bx
mov byte ptr ds:[si] , 0 ;将T2si位置上的数据清空
add si , 1 ;T2的游标移动一位
jmp T2next3
T1toT3:
push di
mov bx , cur
mov ds , bx
mov bh , 0
mov bl , ds:[2]
mov di , bx ;T3的游标位置
mov bx , T3
mov ds , bx
mov ds:[di] , ah ;把ah放到T3中
mov bx , cur
mov ds , bx
add byte ptr ds:[2] , 1 ;T3的游标位置加1
pop di
mov bx , T1
mov ds , bx
mov byte ptr ds:[di] , 0 ;将T1di位置上的数据清空
add di , 1 ;T2的游标移动一位
jmp T1next3
merRet:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
ret
code ends
end start
[07/10/11] |