给定字型有符号整数数组的长度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
-
-
运行结果: