冒泡排序法的几种实现

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值