二分检索(汇编)

本文详细介绍了折半查找算法的基本原理、实现步骤,并通过代码示例展示了如何使用DOS环境下的汇编语言实现折半查找过程。文章强调了算法的时间复杂度优势及其在有序数组检索中的应用。
;#Mode=Dos
;explain:
;折半查找:
;      输入十进制检索key,折半检索目标数组,根据查询结果有无对应返回'Y','N'
;ID:     53101512
;DATE:   2011-11-16 
;AUTHOR: ZhongQiang
data segment
	score db 2,3,45,65,66,89,99
	num equ $-score-1
	message db 'Please input the KEY:','$' 
	crlf db 0dh,0ah,'$'
	nozero db ?
data ends
code segment
	assume cs:code,ds:data
	start:
	mov ax,data
	mov ds,ax
	
	call output
	call search
	
	mov ah,1
	int 21h
	mov ah,4ch
	int 21h
	search proc
		lea dx,message
		call printstring
		call inputdec
		mov dh,bl
		
		mov bx,offset Score
		mov cl,num
		xor ax,ax
		xor ch,ch
		L1:
		cmp al,cl
		jg L3
		mov di,ax
		add di,cx
		sar di,1
		
		cmp dh,[bx+di]
		jz L4
		cmp dh,[bx+di]
		jb L2
		inc di
		mov ax,di
		jmp L1
		L2:
		dec di
		mov cx,di
		jmp L1
		L3:
		mov dl,'N'
		jmp L5
		L4:
		mov dl,'Y'
		L5:
		call printchar
	   ret  
		search endp
	inputdec proc
		push cx
		mov bx,0
		p1:
		mov ah,1
		int 21h
		cmp al,0dh
		je decexit
		sub al,30h
		mov ah,0
		xchg ax,bx
		mov cx,10
		mul cx
		xchg ax,bx
		add bx,ax
		jmp p1
		decexit:
		lea dx,crlf
		call printstring
		pop cx
		ret
		inputdec endp
	printstring proc
		mov ah,9
		int 21h
		ret
		printstring endp
	printchar proc
		mov ah,2
		int 21h
		ret
		printchar endp
	outputdec proc
		push cx
		mov nozero,0
		mov cx,10000
		call main
		mov cx,1000
		call main
		mov cx,100
		call main
		mov cx,10
		call main
		mov cx,1
		call main
		cmp nozero,0
		jne ll
		mov dl,30h
		call printchar
		ll:
		pop cx
		ret
		main proc
			mov ax,bx
			mov dx,0
			div cx
			mov bx,dx
			mov dl,al
			cmp dl,0
			jne ll1
			cmp nozero,0
			jne ll1
			jmp ll2
			ll1:
			mov nozero,1
			add dl,30h
			call printchar
			ll2:
			ret
		main endp
	outputdec endp
	output proc
		lea si,Score
		mov cl,num+1
		next:
		mov bl,[si]
		call outputdec
		mov dl,','
		call printchar
		inc si
		dec cl
		jnz next
		lea dx,crlf
		call printstring
		ret
		output endp
code ends
end start


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值