直接插入排序是一种比较简单的排序。
原理是:
从第二个数开始,依次把每个数当作选定数,在选定数的前面,通过比较大小的方式找到选定数的正确位置,
把该位置之后到选定数之间的数均向后移一位,再通过交换,将选定数放入属于他的位置中
循环上述操作直到对除第一位以外的所有数都操作了一边,即完成排序。
下面我们来看看相应的汇编代码:
DATAS SEGMENT
ary dw 2,48,51,21,36,19,14,16,12,33
count dw 20
DATAS ENDS
STACKS SEGMENT
dw 20 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov bx,2;bx记录操作次数,从第二个数开始操作
beginer:
cmp bx,count
jnb exit;超出比较次数则跳转
mov ax,ary[bx];用ax记录当前正在操作的数
cmp ax,ary[bx-2]
jnb tonext;如果该数比前一个数都大,则不用继续操作了
cando:
mov di,bx
sub di,2
acj:
cmp ax,ary[di]
jnb chang
mov dx,ary[di]
mov ary[di+2],dx;前面的数依次往后移
sub di,2
cmp di,0
jb chang;di<0,即操作到第一个数则跳出循环
jmp acj;没找到正确位置,则返回继续循环
chang:;找到该数应放的位置,进行交换
mov ary[di+2],ax;a[j+1]=a[j]
tonext:
add bx,2;第二个数操作完,开始操作下一个数
jmp beginer
exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START
从代码可以看出,这也是一个复杂度为O(n^2)的排序算法,
且因为两个一样的数排序之后相对位置不变,所以也是一个具有稳定性的算法。
(如有错误,欢迎指出)