【8086汇编】基础排序之直接插入排序

直接插入排序是一种比较简单的排序。


原理是:

从第二个数开始,依次把每个数当作选定数,在选定数的前面,通过比较大小的方式找到选定数的正确位置,

把该位置之后到选定数之间的数均向后移一位,再通过交换,将选定数放入属于他的位置中

循环上述操作直到对除第一位以外的所有数都操作了一边,即完成排序。


下面我们来看看相应的汇编代码:

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)的排序算法,

且因为两个一样的数排序之后相对位置不变,所以也是一个具有稳定性的算法。


(如有错误,欢迎指出)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值