汇编排序算法小结

1.冒泡排序

(1) 思路:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。

  (2) 代码:

DATA SEGMENT
ARR  DB 1,5,3,7,9
NUM  EQU $-ARR
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
      DB 100 DUP(0)
STACK ENDS


CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
     MAIN PROC FAR
     PUSH DS
     MOV AX,0
     PUSH AX

     MOV AX,DATA
     MOV DS,AX

     MOV CX,NUM
     LEA BX,ARR
     MOV SI,0
     MOV DI,0

LP1: 
     PUSH CX
     MOV CX,NUM-1              ;比较次数
     SUB CX,SI                      
     MOV DI,0  
LP2:  
     MOV AL,[BX+DI]
     MOV AH,[BX+DI+1]
     CMP AL,AH
     JA  CHANGE                 ;无符号数比较
EXIT:
     INC DI
     LOOP LP2
     POP CX
     LOOP LP1

     INT 03H
     RET
     MAIN ENDP
CHANGE: 
     MOV AL,[BX+DI+1]
     MOV AH,[BX+DI]
     MOV [BX+DI+1],AH
     MOV [BX+DI],AL
     JMP EXIT
CODE ENDS
     END MAIN

冒泡排序(从小到大),第一次比较,最大的数会被排在最右边,因此,两两比较的时候,可用NUM-1-SI(NUM:排序的个数,SI:当前循环的次数),如果最小的数在最右边,最多需要NUM-1次排序,因此为了保证排序完成需要执行NUM-1次。

2.选择排序

(1)  思路:

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

(2)代码

DATA SEGMENT
ARR  DB 1,5,8,7
NUM  EQU $-ARR
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
      DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
     MAIN PROC FAR
     PUSH DS
     MOV  AX,0
     PUSH AX

     MOV AX,DATA
     MOV DS,AX

     MOV BX,OFFSET ARR
     MOV SI,0
     MOV DI,0

     MOV CX,NUM-1
LP1: 
     PUSH CX
     MOV DI,SI
     INC DI
     MOV CX,NUM
     SUB CX,DI
LP2:
     MOV AL,[BX+SI]
     MOV AH,[BX+DI]
     CMP AL,AH
     JA  CHANGE     
EXIT:
     INC DI
     LOOP LP2
     INC SI
     POP CX
     LOOP LP1
     
     INT 3H
     RET
     MAIN ENDP
CHANGE:
     MOV [BX+DI],AL
     MOV [BX+SI],AH
     JMP EXIT
CODE ENDS
     END MAIN

3. 插入排序

(1) 思路:

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

(2) 代码:

DATA SEGMENT
ARR  DB 1,5,0,7
NUM  EQU $-ARR
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
      DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
     MAIN PROC FAR
     PUSH DS
     MOV  AX,0
     PUSH AX

     MOV AX,DATA
     MOV DS,AX

     MOV BX,OFFSET ARR
     MOV DI,1

     MOV CX,NUM-1
LP1:    
LP2:
     MOV AL,[BX+DI-1]
     MOV AH,[BX+DI]     
     CMP AH,AL
     JB  CHANGE
EXIT:
     INC DI
     LOOP LP1
     
     INT 3H
     RET
     MAIN ENDP
CHANGE:
      MOV [BX+DI],AL
      MOV [BX+DI-1],AH
      DEC DI
      CMP DI,0
      JA  LP2
      JMP EXIT

CODE ENDS
     END MAIN

未完待续。。。。。。

  • 17
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值