题目
给一个长度为n的数组进行冒泡排序。
思路
相较上一篇的冒泡排序,数组需要比较(N-1)遍,但是有时候比较的遍数未达(N-1)时就已经整序完毕,但程序必须运行到(N-1)次才能结束。为了提高效率,可以采用一个交换标志位,每次进入外循环就置交换标志位为1,在内循环中每做一次交换操作就置标志位为0,每次内循环结束后,可以测试交换标志位,如果该位为0,则交换过再次进入外循环,否则就立即结束外循环。
代码
datasg segment
array dw 3,5,6,1,4,2,9,7,0,8
n dw 10
datasg ends
;--------------
codesg segment
assume ds:datasg,cs:codesg,es:datasg
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;--------------
mov cx,n
dec cx
init: ;外层循环
mov di,0
push cx ;外层循环计数器
mov bx,1 ;bx为flag标志位
next: ;内层循环
mov ax,array[di]
cmp ax,array[di+2]
jbe nextnum ;a[j]<a[j+1]小于等于不用交换
mov bx,0 ;flag标志位设为0,交换过
xchg ax,array[di+2]
mov array[di],ax
nextnum:
add di,2
loop next
pop cx
cmp bx,0 ;判断bx是否为0
jnz exit ;没有交换过,直接退出
loop init
;---------------
exit:
ret
main endp
codesg ends
end start
调试
未排序前
排序后