mips写快排

题目要求

第一行输入组数,多组输入数据。
快排后输出。

对照c代码

void quick_sort(int a[], int l, int r)
{
    if (l < r)
    {
        int i,j,x;
        i = l;
        j = r;
        x = a[i];
        while (i < j)
        {
            while(i < j && a[j] > x)
                j--; // 从右向左找第一个小于x的数
            if(i < j)
                a[i++] = a[j];
            while(i < j && a[i] < x)
                i++; // 从左向右找第一个大于x的数
            if(i < j)
                a[j--] = a[i];
        }
        a[i] = x;
        quick_sort(a, l, i-1); /* 递归调用 */
        quick_sort(a, i+1, r); /* 递归调用 */
    }
}

mips代码

.data
nsnmn: .space 4100

.text
main:
la $s0,nsnmn#s0起始地址
li $v0,5
syscall
move $s1,$v0#s1=n
li $t0,0#t0=i
li $a0,0
addi $a1,$s1,-1
read:
beq $t0,$s1,qsort_go
li $v0,5
syscall
move $t1,$v0#t1:nsnmn[i]
sll $t2,$t0,2#偏移量
add $t3,$s0,$t2
sw $t1,0($t3)
add $t0,$t0,1
j read

qsort_go:

jal qsort
li $t0,0
addi $t7,$s1,-1
j output

qsort:
addi $sp,$sp,-16
sw $s4,12($sp)
sw $ra,8($sp)
sw $s2,4($sp)
sw $s3,0($sp)
move $s2,$a0
move $s3,$a1

slt $t0,$s2,$s3
beq $t0,0,exit1

move $t0,$s2#t0:i  t1:j  t3:a[i]
move $t1,$s3
#求a[i]-----
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
lw $t3,0($t4)
move $t7,$t3
#----------
loop:
slt $t2,$t0,$t1
beq $t2,0,exit0
loop1:
slt $t2,$t0,$t1
beq $t2,0,if1#
#求a[j]--------
sll $t4,$t1,2#偏移量
add $t4,$s0,$t4
lw $t2,0($t4)#t2:a[j]
#-----------
slt $t5,$t7,$t2
beq $t5,0,if1#
addi $t1,$t1,-1
j loop1
# t0:i  t1:j  t3:a[i]  t2:a[j]

if1:
slt $t4,$t0,$t1
beq $t4,0,loop2#
#求a[j]--------用之前都要记得刷新
sll $t4,$t1,2#偏移量
add $t4,$s0,$t4
lw $t2,0($t4)#t2:a[j]
#求a[i]的地址-----------
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
sw $t2,0($t4)
addi $t0,$t0,1

loop2:
#求a[i]-----
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
lw $t3,0($t4)
slt $t4,$t0,$t1
beq $t4,0,if2#
slt $t4,$t3,$t7
beq $t4,0,if2#
addi $t0,$t0,1
j loop2

if2:
slt $t4,$t0,$t1
beq $t4,0,loop#
#求a[i]--------用之前都要记得刷新
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
lw $t3,0($t4)#t2:a[i]
#求a[j]的地址-----------
sll $t4,$t1,2#偏移量
add $t4,$s0,$t4
sw $t3,0($t4)
addi $t1,$t1,-1
j loop

exit0:
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
sw $t7,0($t4)
move $s4,$t0
addi $a1,$s4,-1
move $a0,$s2
jal qsort
addi $a0,$s4,1
move $a1,$s3
jal qsort

exit1:
lw $s4,12($sp)
lw $ra,8($sp)
lw $s2,4($sp)
lw $s3,0($sp)
addi $sp,$sp,16
jr $ra

output:
bnez $t0,output_
li $v0,11
li $a0,91
syscall
output_:
li $v0,1
sll $t4,$t0,2#偏移量
add $t4,$s0,$t4
lw $a0,0($t4)
syscall
add $t0,$t0,1
beq $t0,$s1,exit
li $v0,11
li $a0,44
syscall
j output

exit:
li $v0,11
li $a0,93
syscall
li $v0,10
syscall

解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
太离谱了,太难了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值