给定字型有符号整数数组的长度n,键盘输入字型有符号整数,找出并输出第n/2小的数。
原理:先冒泡排序,后取中间。
include io.inc
.model small
.stack
.data
msg1 db 'Input n:',13,10,0
msg2 db 'The Median Is:',0
array dw 100 dup(?) ;待输入
n db '?'
count db 0 ;保存数组长度
count1 db 1
result db 0 ;保存中位地址
.code
.startup
lea ax,msg1 ;提示输入
call dispmsg
call readuib ;读入无符号位十进制整数
call dispcrlf ;回车换行
mov n,al
mov count,al
mov count1,al
mov bx,offset array ;获取array首地址
start:
call readsiw
mov [bx],al ;读入数据
call dispcrlf
add bx,2
cmp n,0 ;n等于0时候跳出,否则循环读取数据
dec n
jz sort
jmp start
sort: ;读入完毕,进入排序
mov cl,count
dec cx ;循环count-1次,count,db型,只取cx低四位cl
outlp:
mov dx,cx ;内循环cx次
mov bx,offset array
inlp:
mov ax,[bx] ;取前一个元素
cmp ax,[bx+2] ;有符号数比较
jl next ;前一个元素不大于后一个元素,不交换标号
xchg ax,[bx+2] ;前一个元素大于后一个元素,则进行交换
mov [bx],ax
next:
add bx,2 ;下一个元素
dec dx
jnz inlp ;内循环尾
loop outlp ;外循环尾
mov bx,offset array
mov al,count1 ;选右边
mov bl,2
idiv bl
mov result,al
mov bx,0
done: ;取中间数
cmp result,0
jz output
add bx,2
dec result
jmp done
output:
mov ax,offset msg2
call dispmsg
mov ax,[array+bx] ;首地址+偏移量,找到第n/2个数
call dispsib
.exit
end
运行结果: