汇编快速排序

快速排序

emu8086可成功执行

data segment
     buff dw 0000h, 0001h,0002h,0004h,0003h,0005h,0007h,0006h
     count equ $*buff
data ends

stack segment papa    stack 'stack'
      dw  100 dup(?)
stack ends

code  segment
      assume  cs:code, ds:data, ss:stack

  start:


           mov ax, data
           mov ds, ax

           mov si, 0
           mov di, 98                              ;si, di 设置初始值
           call quicksort                          ;调用快排

           mov ax, 4c00h
           int 21h


quicksort proc near

            push si
            push di                                ;保存原有的si,di
            call part                              ;调用part函数

            pop di
            pop si

            push di
            push ax                                ;part函数中,ax用来保存新的si
            cmp ax,0000h
            jbe x1
            sub ax,2                               ;ax作为左边部分的di


            mov di,ax

            cmp si,di
            jae x1
            call quicksort                         ;如果左半部分的si=<di,左半部分进行递归
            x1:nop

            pop ax                                 ;ax作为右半部分的si
            add ax,2
            mov si,ax
            pop di
            cmp si,di
            jae x2
            call quicksort                         ;如果右半部分的si=<di,右半部分进行递归
            x2:nop
            ret

quicksort endp

part proc near                                     ;part函数,将当前si所指的关键字插入到正确位置
    mov bx, word ptr buff[si]

l1:                                                ;di所指的数值与si比较,如果所指数值小于si数值,交换,否则di-2

       cmp si, di                                  ;如果si=di,返回
       jae l
       mov ax, word ptr buff[di]
       cmp ax, bx
       jae done1
       mov ax, word ptr buff[si]
       xchg ax, word ptr buff[di]
       mov  word ptr buff[si], ax
       jmp l2


done1: sub di,2
       jmp l1

l2:    cmp si,di                                   ;si所指的数值与di比较,如果所指数值大于di数值,交换,否则si+2
       jae l
       mov ax, word ptr buff[si]
       cmp bx, ax
       jae done2
       mov ax, word ptr buff[si]
       xchg ax, word ptr buff[di]
       mov  word ptr buff[si], ax
       jmp l1

done2: add si,2
       jmp l2

l:     mov ax,si                                  ;保存此时的si



       ret

part endp

code ends
     end start
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章