彙編快速排序

快速排序

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章