一、 汇编实现(基于51单片机)
ORG 0000H
MOV R1,#0AH ;长度送R1
MOV R0,#50H ;A=50H
MOV A,#0AH ;A=0AH
INIT0: MOV @R0,A ;将A内的值赋给R0指向的地址,(50H)= A
DEC A ;A的值自减1
INC R0 ;R0的值自加1,实现指针的向上偏移,R0=51H
DJNZ R1,INIT0
PXCX: MOV R3,#50H ;R3=50
QL4: MOV A,R3 ;指针送A=50H
MOV R0,A ;R0=50H
MOV R7,#0AH ;长度送R7=0AH
CLR 00H ;标志位=0,用OOH字节作标志位
MOV A,@R0 ;将R0指向地址的数据取出来,如第一次A=0AH
QL2: INC R0 ;R0的值自加1,如第一次R0=51H
MOV R2,A ;R2=A
CLR C ;清除标志位C
MOV 22H,@R0 ;(22H)获取R0指向地址的数据
CJNE A,22H,QL3 ;相等吗?比较两个数据的值的大小
SETB C ;执行到这,说明两个数值相等
QL3: MOV A,R2 ;A=R2
JC QL1 ;大于交换位置, CJNE 这个操作会引起C的置位,A<(22H)则
;C=1,两数已满足排序要求,跳到下一循环即可
SETB 00H ;由于A>(22H),说明还有需交换的数据,置标志位
XCH A,@R0 ;进行交换,其中@R0=(22H)
DEC R0 ;寄存器指向前一数据
XCH A,@R0 ;交换位置
INC R0 ;寄存器指向下一数据
QL1: MOV A,@R0 ;A获取R0指向地址的数据,准备第二次循环比较
DJNZ R7,QL2 ;R7计数器如果不为零,则继续循环比较
JB 00H,QL4 ;当本次循环中有交换时,需要再进行一次循环比较
SJMP $ ;如果没有交换发生则退出
END
二、C++语言实现
(1)方法1:
/*数值交换*/
template<class Item>
void Exch(Item &A, Item &B)
{
Item t = A;
A = B;
B = t;
}
/*数值比较交换*/
template<class Item>
void CompExch(Item &A, Item &B)
{
if(B<A)
{
Exch(A, B);
}
}
/*冒泡发排序*/
template<class Item>
void Bubble(Item a[], int l, int r)
{
for(int i=l; i<r; i--)
{
for(int j=r; j>r; j--)
{
CompExch(a[j-1], a[j]);
}
}
}
(2)方法2:
/*数值比较交换*/
template<class Item>
void CompExch_Ex(Item &A, Item &B, BOOL flag)
{
if(B<A)
{
Exch(A, B);
flag = TRUE;
}
}
/*冒泡发排序*/
template<class Item>
void Bubble_Ex(Item a[], int l, int r)
{
BOOL flag = FALSE;
for(int i=l; i<r; i--)
{
flag = FALSE;
for(int j=r; j>r; j--)
{
CompExch(a[j-1], a[j], flag);
}
if(FALSE == flag)
{
return; /*说明已按顺序排列了,退出*/
}
}
}