【8086汇编】基础排序之基数排序

基数排序也叫做“桶子法”,通过数的部分内容,将要排序的数分配到一个个“桶”中,再进行新的串联。最高位有几位,就循环几次,借此达到排序的作用。

简单来举个例子:一个最高位为3为的数序列,把数按照个位顺序组成一个新的序列,再把数按照十位顺序组成一个新的序列,最后再把数按照百位顺序组成一个新的序列,即完成排序。

原理很多地方都有,不再赘述

下面我们照常看一下基数排序的汇编代码


;这个代码只符合对1000以下的10个三位数排序
DATAS SEGMENT
    temp db 100 dup(0)
    data db 73, 22, 56, 14, 24, 65, 39, 81, 33, 100
    order db 10 dup(0)
    ten db 10
DATAS ENDS

STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS

CODES SEGMENT
    
START:
main proc far
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
    MOV AX,DATAS
    MOV DS,AX
    
    mov cx,3;因为最多只有三位数
    mov dl,1
    mov dh,0;下面用除以dl的方式分别去到个十百的位数
    mov di,0;
loop1:
	push cx
	
    mov bp,0;bp=i=0
getNumber:;第一个循环用于分桶
	mov al,ds:data[bp]
	mov ah,0
	div dl
	mov ah,0
	div ten
	mov al,ah
	mov ah,0
	mov si,ax;用si表示lsd(详情去百度基数排序看解释)
	
	mov bl,ds:order[si]
	mov bh,0
	add ds:order[si],1
	mov ax,si
	mul ten
	mov si,ax
	mov al,ds:data[bp]
	mov ds:temp[si][bx],al

	
	inc bp
	cmp bp,10
	jb getNumber
    
    mov bp,0
zuhe:;第二个循环把分好桶的数字重新串联起来
	mov al,ds:order[bp]
	cmp al,0
	jz tonext
	
	mov bx,0
paixu:
	mov ax,bp
	mul ten
	mov si,ax
	mov al,ds:temp[si][bx]
	mov ds:data[di],al
	inc di
	
	inc bx
	cmp bl,ds:order[bp]
	jb paixu
	
	mov ds:order[bp],0
tonext:	
	inc bp
	cmp bp,10
	jb zuhe
    
    mov ax,dx
    mul ten
    mov dx,ax;用于求下一位数
    mov di,0
    pop cx
    loop loop1
    
    MOV AH,4CH
    INT 21H
main endp

CODES ENDS
    END START



另外,基数排序是一种不稳定的排序算法,它的复杂度是 O (nlog(r) m)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值