题目要求
第一行输入组数,多组输入数据。
快排后输出。
对照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
解释
太离谱了,太难了