冒泡法排序:
冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。
但是这种冒泡法排序却有很大的弊端
可以看见在第一次排序后虽然最大的数字被移动到了最右的位置,但是这轮排序对其他的数字并没有造成有益的影响,甚至第二大的数字8还被向左移了一位,这样的排序在数据量比较小的时候体现差异不大,但是如果数据量很大的情况下,数据交换的次数将会有很多,而且是不必要的,所以对传统冒泡法进行了优化。
优化的冒泡法:
从第一位开始,第一位和第二位比较,若第一位比第二位大,则两数交换,然后比较第二位和倒数第三位,以此类推。第一次循环结束后,这组数中最大的值被移到最右段,这样第二次则不需要比较最后一位,只比较到倒数第二位即可,第三次比较到倒数第二位,以此类推。
汇编代码实现:
例:
用冒泡法使数组按从小到大排序,并将排序结果存放到附加段中。
data segment
x db 32,-43,76,95,-1,-78,127,-128,-125,88
data ends
extra segment
y db 10 dup (?)
extra ends
code segment
assume cs:code,ds:data,es:extra
start:mov ax,data
mov ds,ax
mov cx,9
mov di,-1
outside: mov si,offset x
add si,8
inside:mov al,[si]
mov bl,[si+1]
cmp al,bl
jle jump
xchg al,bl
jump: mov [si],al
mov [si+1],bl
dec si
push si
cmp si,di
jz channel
pop si
jmp inside
channel:pop si
inc di
loop outside
mov cx,10
get: mov bx,offset y
add bx,cx
dec bx
mov al,[bx]
mov es:[bx],al
loop get
mov ah,4h
int 21h
code ends
end start