一、 汇编实现(基于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; /*说明已按顺序排列了,退出*/
}
}
}
评论