MIPS好难,把递归的实例放在这里供自己模仿使用。
实例是一个快速排序,就粗略说一下原理,以一个数为标准,使用两个指针从数组的尾部和首部移动,先移动右侧,遇到的第一个比标准小的数进行交换,在移动左侧,遇到第一个比标准大的数进行交换,所以此时左侧的数组是排好顺序的,然后往下递归即可分为左侧的数组和右侧的数组。
下面放一个快排的C语言代码:
int getstandard(int i, int j){
//基准数据
int key = array[i];
while(i < j){
//因为默认基准是从左边开始,所以从右边开始比较
//当队尾的元素大于等于基准数据的时候,就一直向前挪动j指针
while(i < j && array[j] >= key){
j--;
}
//当找到比array[i]小的时候,就把后面的值array[j]赋给它
if(i < j){
array[i] = array[j];
}
//当队首元素小于等于基准数据时就一直往后移动i指针
while(i < j && array[i] <= key){
i++;
}
//当找到比array[j]大的时,就把前面的值array[i]赋给他
if(i < j){
array[j] = array[i];
}
}
//跳出循环时i和j相等,此时的i或者j就是key的正确索引位置
//把基准数据赋给正确位置
array[i] = key;
return i;
}
void QuickSort(int low,int high){
if(low < high){
//分段位置下标
int standard = getstandard(low, high);
//递归调用排序
//左边排序
QuickSort(low, standard - 1);
//右边排序
QuickSort(standard + 1, high);
}
}
MIPS对着翻译即可,下面是MIPS的代码:
.data
array:.space 4000
str_comma:.asciiz","
str_left_kuo:.asciiz"["
str_right_kuo:.asciiz"]"
.text
li $v0,5
syscall
move $s0,$v0 #s0为个数
li $t0,0
li $s2,0 #low
addi $s2,$s0,-1 #high
sw $s2,-4($sp)
sw $s2,-8($sp)
input:
beq $t0,$s0,end_input
sll $t1,$t0,2
li $v0,5
syscall
sw $v0,array($t1)
addi $t0,$t0,1
j input
end_input:
li $t0,0
li $t1,0 #把寄存器清零
jal QuickSort #之后就是纯输出
li $t0,0
la $a0,str_left_kuo
li $v0,4
syscall
addi $s0,$s0,-1 #为了让逗号不多
out:
beq $t0,$s0,finish
sll $t1,$t0,2
lw $t3 array($t1)
move $a0,$t3
li $v0,1
syscall
la $a0,str_comma
li $v0,4
syscall
addi $t0,$t0,1
j out
finish:
sll $t1,$t0,2
lw $t3,array($t1)
move $a0,$a3
li $v0,1
syscall
la $a0,str_right_kuo
li $v0,4
syscall
li $v0,10
syscall
getStandard:
lw $t0,4($sp) #j
lw $t1,8($sp) #i
sll $t2,$t1,2
lw $s1,array($t2) #key,$t3 = array[i]
li $t7,2
loop1:
bge $t1,$t0,end_loop1
loop2:
slt $t4,$t1,$t0
sll $t2,$t0,2
lw $t5,array($t2) #$t5 = array[j]
sle $t6,$s1,$s5
addu $t4,$t4,$t6
bne $t4,$t7,end_loop2
addi $t0,$t0,-1
j loop2
end_loop2:
bge $t1,$t0,loop3
sll $t2,$t0,2
lw $t5,array($t2) #$t5 = array[i]
sll $t2,$t1,2
sw $t5,array($t2)
loop3:
slt $t4,$t1,$t0
sll $t2,$t1,2
lw $t3,array($t2) #$t3 = array[i]
sle $t6,$t3,$s1
addu $t4,$t4,$t6
bne $t4,$t7,end_loop3
addi $t1,$t1,1
j loop3
end_loop3:
bge $t1,$t0,again
sll $t2,$t1,2
lw $t3,array($t3) #$t3 = array[i]
sll $t2,$t0,2
sw $t3,array($t2)
again :
j loop1
end_loop1:
sll $t2,$t1,2
sw $s1,array($t2)
sw $t1,-4($sp) #每次$sp都对准$ra
jr $ra
QuickSort:
addi $sp,$sp,-12
sw $ra,0($sp)
lw $s2,8($sp) #low
lw $s3,4($sp) #high
bge $s2,$s3,end
sw $s2,-4($sp)
sw $s3,-8($sp)
jal getStandard
lw $s4,-4($sp) #standard
lw $s2,8($sp) #low
lw $s3,4($sp) #high
sw $s2,-4($sp)
addi $s5,$s4,-1
sw $s5,-8($sp)
jal QuickSort
lw $s2,8($sp) #low 重新取low和high
lw $s3,4($sp) #high
sw $s3,-8($sp)
addi $s5,$s4,1
sw $s5,-4($sp)
jal QuickSort
end:
lw $ra,0($sp)
addi $sp,$sp,12
jr $ra