MIPS递归实例

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值