汇编语言:冒泡排序及其改进方法
题目
在数据区存放一组数据,要求采用冒泡排序对该数据区中的数据按递增关系排列。
设计思想
1.内层循环 从第一个数开始,依次把相邻的两个数进行比较,即第n个数和第n+1个数进行比较,如果第s[n]<s[n+1],则n++继续比较;如果s[n]>s[n+1],交换s[n]和s[n+1]。直到最后剩下的数字全部比较完毕,其实就是取出这些数字里面最大的放在最后一位。
2. 外层循环对剩下的N-1个数字重复步骤一,找到剩下的N-1个数字中的最大的数字,在比较过程中将其移至最后第N-1位。
3. 重复步骤二直到顺序排列好(注:这里只需要进行N-1次外层循环即可,因为最后一个次比较只剩下一个数字,此时无须比较)。
4. 改进方案:因为外层循环在没有全部进行完之后就有可能顺序正确了(考虑:123476排序,只进行一次外层循环顺序就正确了),这时候我们可以设置一个标志位flag,每次外层循环前将其清零,如果在比较的过程中有交换那么我们就flag++,否则就不操作。外层循环结束时,如果flag==0,那么我们就直接结束程序不再进行后续循环。
流程图
我们以N等于10为例进行编程,如果数字排序个数不一样需要调整参数
程序代码及运行
运行环境
Windows10
DOSBox0.74-3,Cpu speed:3000cycles
代码
data segment
org 3000h
num db 30h,35h,36h,37h,40h,79h,66h,78h,67h,60h
org 3010h
flag db ?
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,9;外循环次数
mov bx,0;标志位flag
outer:
push cx;将外循环次数入栈
mov si,offset num
mov di,offset flag
mov byte ptr[di],0
add bx,1
inner:
mov al,[si]
cmp al,[si+1]
jbe noswap
xchg al,[si+1]
mov [si],al
add byte ptr[di],1
noswap:
add si,1
loop inner
cmp byte ptr[di],0
je exitip
pop cx;外循环次数出栈
loop outer
exitip:
mov ah,4ch
int 21h
code ends
end start
运行过程