SST SEGMENT STACK "STACK" dw 1000 dup (?) SST ENDS DAT SEGMENT msg_ish_mas db "Ishodnii massiv: ", "$" msg_otsrt_mas db 0ah,0dh,"Otsortirovannie elementi massiva: ", "$" mas db 3,7,8,5,2,0,1,6,4 ;9 kol-vo elem n = $-mas z db 0 DAT ENDS COD SEGMENT assume SS:SST, DS:DAT, CS:COD LOCALS @@ Begin: mov ax, DAT mov ds, ax mov ax, 03 ; Очистка экрана int 10h mov ax,0 push ax mov ax,n-1 push ax call quicksort mov ah,9 lea dx, msg_otsrt_mas ; Выводим сообщение message2 int 21h mov cx, n ; В цикле выводим элементы отсортированного массива mov si,0 mov ah,02h m9: mov dl, mas[si] add dl,30H int 21H mov dx, " " int 21H add si,1 loop m9 mov ah,4ch ; Корректное завершение нашей программы int 21h ;----------- quicksort proc near @@L_ind EQU WORD PTR [BP+6] @@R_ind EQU WORD PTR [BP+4] @@i EQU WORD PTR [BP-2] @@j EQU WORD PTR [BP-4] push bp ; "Пролог" mov bp,sp sub sp,4 ; выделение места под локальные переменные @@i, @@j ;mov si,4 mov bx, @@R_ind ; N правая граница (ah)bx ;mov j,.. ;add si,2 mov ax, @@L_ind ; 1 левая граница (al)ax ; mov i,.... mov @@i, ax mov @@j, bx add ax,bx ; ax = l+r mov bl,2 ;delitel div bl mov ah,0 mov si, ax mov al, mas[si] ; ax:=a[(l+r) div 2] rpt: while_bg1: mov si,@@i cmp mas[si],al jae while_end1 ;a[i]<x inc @@i jmp while_bg1 while_end1: while_bg2: mov si,@@j cmp al,mas[si] jae while_end2 ;x<a[j] dec @@j jmp while_bg2 while_end2: mov ax,@@i mov bx,@@j cmp ax,bx jnbe m3;i>j push cx mov si,ax mov cl, mas[si] mov z,cl mov si,bx mov cl, mas[si] mov si,ax mov mas[si], cl mov cl,z mov si,bx mov mas[si], cl pop cx inc @@i dec @@j m3: mov ax,@@i cmp ax,@@j jle rpt ;i<=j mov cx,@@L_ind cmp cx,@@j jge @@m1 push cx push @@j call quicksort @@m1: mov dx,@@R_ind cmp @@i,dx jge @@m2 push @@i push dx call quicksort @@m2: mov sp,bp pop bp ret 4 quicksort endp ;------------ COD ENDS END Begin |