merge: # $a0=n $a1=Z $a2=X $a3=Y li $t0, 0 # contatore degli elementi di X li $t1, 0 # contatore degli elementi di Y li $t2, 0 # contatore degli elementi di Z loop: beq $t0, $a0, copiaY # se gli X sono finiti si copiano in Z i rimanenti di Y beq $t1, $a0, copiaX # se gli Y sono finiti si copiano in Z i rimanenti di X lw $s0, ($a2) # x (elemento corrente di X) lw $s1, ($a3) # y (elemento corrente di Y) blt $s0, $s1, minore # se x<y sw $s1, ($a1) # z = y addi $a3, $a3, 4 # prossimo elemento di Y addi $t1, $t1, 1 # numero di elementi consumati di Y b avanti minore: sw $s0, ($a1) # z = x addi $a2, $a2, 4 # prossimo elemento di X addi $t0, $t0, 1 # numero di elementi consumati di X avanti: addi $a1, $a1, 4 # prossimo elemento di Z b loop copiaX: move $t1, $t0 # uso copiaY per copiare i rimanenti elementi in Z move $a3, $a2 copiaY: beq $t1, $a0, finemerge lw $s0, ($a3) # elemento corrente di Y sw $s0, ($a1) # z = y addi $a3, $a3, 4 # prossimo elemento di Y addi $a1, $a1, 4 # prossimo elemento di Z addi $t1, $t1, 1 # conteggio degli elementi b copiaY finemerge: jr $raLa routine mergesort puō essere implementata come segue:
mergesort: # $a0=n, $a1=Z (area temporanea), $a2=X (sorgente e destinazione) beq $a0, 1, esci # un vettore di dimensione n=1 č giā ordinato subu $sp, $sp, 16 # si alloca lo spazio su stack per 4 words (3 argomenti e $ra) sw $a0, 0($sp) # n sw $a1, 4($sp) # Z sw $a2, 8($sp) # X sw $ra,12($sp) # $ra div $a0, $a0, 2 # n' = n/2 jal mergesort # prima chiamata ricorsiva per ordinare la prima metā mul $s0, $a0, 4 # offset per arrivare all'inizio della seconda metā add $a1, $a1, $s0 # Z' = Z---+ (n/2)*4 add $a2, $a2, $s0 # X' = X---+ (n/2)*4 jal mergesort # seconda chiamata ricorsiva per ordinare la seconda metā # ora in Z si trovano le due metā ordinate, le fondiamo mettendo il risultato in X # il numero di elementi n'' = n/2 č giā in $a0 move $a2, $a1 # una delle due sorgenti e' X'' = Z' (la seconda metā ordinata) lw $a1, 8($sp) # la destinazione e' Z'' = X lw $a3, 4($sp) # l'altra sorgente e' Y'' = Z (la prima metā ordinata) jal merge # si fondono i due vettori e si ottiene in X il vettore ordinato # si ripristinano i registri lw $a0, 0($sp) # n lw $a1, 4($sp) # Z lw $a2, 8($sp) # X lw $ra,12($sp) # $ra addi $sp, $sp, 16 # si rilascia lo spazio su stack esci: jr $ra-- AndreaSterbini - 07 Feb 2002
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |