正文

冒泡排序法的几种实现2007-02-20 22:22:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ljqy/23423.html

分享到:

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

阅读(4073) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册