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
未完待续。。。。。。