选择排序(汇编实现)

来源:互联网 发布:linux snmp协议配置 编辑:程序博客网 时间:2024/05/22 17:06

刚学汇编,于是用汇编编写了选择排序算法,初学真是各种心累啊。

(选择排序思想即为每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。)

DATA SEGMENTBUF DB 03H,02H,01H,05H,04H      COUNT EQU $-BUFDATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA      MOV DS,AX      MOV SI,OFFSET BUF ;取BUF偏移地址送SI      MOV CX,COUNT      ;设置循环计数器LOOP1:                  ;外层循环      CALL LOOP2        ;调用子函数LOOP2进行内层循环,两层循环实现选择排序            INC SI            ;地址指针加1      DEC CX            ;计数器减1      JNZ LOOP1      MOV SI,OFFSET BUF      MOV CX,COUNTLP:   CALL OUTPUT       ;(27-32)调用子函数OUTPUT输出排序结果      INC SI      DEC CX      JNZ LP            MOV AH,4CH        ;退出      INT 21HLOOP2 PROC NEAR         ;子函数LOOP2      PUSH CX           ;CX进栈保护现场      MOV DI,SI         ;选择排序,令内外层偏移值相等      MOV AX,DI      SUB AX,OFFSET BUF      MOV DX,COUNT      SUB DX,AX      MOV CX,DX         ;(44-48行)调整好计数器的值AGAIN:                  ;内层循环      MOV AL,[SI]      MOV BL,[DI]      CMP AL,BL         ;选择排序思想,每次将第i小的数放到第i个位置      JA SWAP           ;调用交换子函数      JMP CONTINUE  SWAP: MOV AL,[SI]        ;(56-59行)交换      XCHG AL,[DI]      XCHG AL,[SI]      JMP CONTINUECONTINUE:      INC DI      DEC CX      JNZ AGAIN      POP CX             ;CX出栈回复现场      RET            LOOP2 ENDPOUTPUT PROC NEAR        ;输出单个数的子程序      MOV DL,30H        ;DL初始值30H,因为数字0的ASCII值为30H      MOV AH,02H      ADD DL,[SI]      INT 21H      RETOUTPUT ENDP  CODE ENDS      END START


另附C++代码:

#include<cstdio>int main(){    int buf[]={3,2,1,5,4};    int len=5;    for(int i=0;i<len;i++)    {        for(int j=i;j<len;j++)        {            if(buf[i]>buf[j])            {                int temp=buf[i];                buf[i]=buf[j];                buf[j]=temp;            }        }    }    for(int i=0;i<len;i++)        printf("%d ",buf[i]);    return 0;}


汇编代码运行结果截图(运行环境为DOSBOX):



1 0