在数据区,给出了学生人数及汇编语言课程的成绩,请将成绩排序(由大到小或者由小到大)并保存在原数据区。
dseg segment
db 20
db 98,61,57,82,89,73,61,58,53,54
db 84,78,70,64,84,63,76,84,83,86
dseg ends
源程序:(成绩按由小到大的顺序排列)
如果想按由大到小的顺序排列只需要将子程序sort比较两个相邻的数据处
修改为:(供参考)
s1: mov ah,[si];把低地址数据存入ah
mov al,[si+1];把高地址数据存入al
cmp ah,al;比较相邻两个数据的大小
ja next;ah大于al则跳转
mov [si],al
mov [si+1],ah;否则两者交换
next:inc si
loop s1
个人心得:解决冒泡排序的关键就是搞清楚两层循环的循环次数,而恰好外层循环的循环次数同样是内层循环的比较次数!这就是解决问题的关键点。
assume cs:cseg, ds:dseg, ss:sseg
sseg segment stack
dw 100H dup (?)
sseg ends
dseg segment
db 20
db 98,61,57,82,89,73,61,58,53,54
db 84,78,70,64,84,63,76,84,83,86
dseg ends
cseg segment
start: mov ax,dseg
mov ds,ax
mov ax,sseg
mov ss,ax
mov sp,200h
mov cl,ds:[0]
mov ch,0 ;cx中存储要排序数的个数
mov bx,1 ;要排序数的起始偏移地址
call sort
mov ax,4c00h
int 21h
;子程序名:sort
;功 能:对从(DS):(bx)开始的(cx)个字节排序
;入口参数:(DS):(BX)保存数据的起始地址
; (cx)中是要排序的数据个数
;出口参数:无
sort proc
push si
push ax
sub cx,1;循环次数是排序个数减1
s:push cx;外层循环次数压入栈,外层循环次数同样是内层循环的比较次数
mov si,bx;每次外层循环从第一个数开始
s1:mov ah,[si];把低地址数据存入ah
mov al,[si+1];把高地址数据存入al
cmp ah,al;比较相邻两个数据的大小
jbe next;ah小于等于al则跳转
mov [si],al
mov [si+1],ah;否则两者交换
next:inc si
loop s1
pop cx
loop s
pop ax
pop si
ret
sort endp
cseg ends
end start
可以与C语言的冒泡排序进行类比 :
#include<stdio.h>
int main()
{
int i,j,t,
a[10]={123,5,9,11,33,6,9,76,100,3};
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}
流程图:
运行结果: