正文

冒泡排序法的几种实现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; /*说明已按顺序排列了,退出*/        }    }}

阅读(4124) | 评论(0)


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

评论

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