MIPS中的递归快速排序

时间:2018-10-26 03:50:07

标签: mips

希望大家度过愉快的一天

所以我正在上MIPS课程,并获得了这份作业 我解决了,但是发现自2天以来我无法解决的问题.... 因此,问题是将此快速排序代码转换为MIPS,并创建一些功能来打印和读取用户输入的元素 我的问题是快速排序。

void quick_sort(int array[], int n) {
 int i = 0; // i = low index
 int j = n-1; // j = high index
 int pivot = array[(i+j)/2]; // pivot = middle value
 while (i <= j) {
 while (array[i] < pivot) i++;
 while (array[j] > pivot) j--;
 if (i <= j) {
 int temp = array[i];
 array[i] = array[j]; // swap array[i]
 array[j] = temp; // with array[j]
 i++;
 j--;
 }
 }
 if (j > 0) quick_sort(&array[0], j+1); // Recursive call 1
 if (i < n-1) quick_sort(&array[i], n-i); // Recursive call 2
} 

这是我的主要

.data
 hi: .asciiz"Please Enter the number of elements greater than 1\n"
 elements : .asciiz " Please enter the elements \n"
print1:.asciiz"Array before sorting\n"
print2:.asciiz"Array after sorting\n "
comma : .asciiz","
space : .asciiz"\n"
array: .space 32
.text
start:
la $a0 , hi   # enter elements
li $v0 , 4
syscall

li $v0 , 5    # number of elements greater than 1
syscall
ble $v0 , 1 , start
move $s0, $v0  # save number of elements  n = $s0

la $a0 , elements  #enter elements string
li $v0 , 4
syscall

sll $a0 , $s0 , 2   # number of bytes to allocate ( 4 bytes for each integer)
li $v0 , 9
syscall
move $s1 , $v0 # address of the array = $s1


move $a0 , $s0  #number of elements
move $a1 , $v0  #array address
jal read_array

la $a0 , print1   # befor sorting text
li $v0 , 4
syscall

move $a0 , $s0 #number of elements
move $a1 , $s1      # array address 
jal print_array  #printing array before sorting

#sorting
move $a0 , $s0  #number of elements
move $a1 , $s1       # array address 
jal quick_sort

la $a0 , print2   # After sorting text
li $v0 , 4
syscall

# after sorting 
move $a0 , $s0 #number of elements
move $a1 , $s1      # array address 
jal print_array  #printing array before sorting


li $v0 , 10
syscall

所以我在以下位置调用了快速排序功能 “排序”评论。

这是它本身的功能

quick_sort:
add $s3 , $0 , $a1 # saving array address
sort_loop:


add $sp , $sp , -16 # storing the address
sw $ra , 0($sp) # return address
sw $a0 , 4($sp) # n
sw $a1 , 8($sp) # array address
sw $t0 , 12($sp) # i


li $t0 , 0    #i
add $t1 , $a0 ,-1  # j=n-1

#pivot 
add $t2 , $t0 , $t1 # i + j
srl $t2 , $t2 , 1 # (i+j)/2
#calculate the address for the pivot 
sll $t2 , $t2 ,2  # ((i+j)/2) * 4
add $t3 , $a1 , $t2   # &array + ((i+j)/2) * 4 ( address of the pivot)
lw $t4 , 0($t3) # Pivot value
#============
#while loop
while_main:
bgt $t0 , $t1 , after_if # while i <= j
while_i:
sll $t5 , $t0 , 2  # i * 4
add $t8 , $t5 , $a1 # &array + (i*4) (address of the ith value)
lw $t5 , 0($t8)  # value of ith
bge $t5 , $t4 , while_j # if (array[i] >= pivot ) skip
add $t0 , $t0 , 1 #i++
j while_i
while_j:
sll $t6 , $t1 , 2 # j*4
add $t9 , $t6 , $a1 #  &array + (j*4) (address of the jth value)
lw $t6 , 0($t9)  # value of jth
ble $t6 , $t4 , if # if (array[j] <= pivot ) skip
add $t1 , $t1 , -1 #j--
j while_j
if:
bgt $t0 , $t1 , after_if  # if (i>=j) skip
sw $t6 , 0($t8) # array[i] = array[j]
sw $t5 , 0($t9) # array[j] = old array[i]
add $t0 , $t0 , 1 #i++
add $t1 , $t1 , -1 #j--
j while_main
after_if:
#end of while_main loop
#recursive #1
r1:
blez $t1 , r2  # if (j <=0) skip
add $a0 , $t1, 1   # n = j+1
add $a1 , $0 , $s3 # address of the array a1  
jal sort_loop




#recursive #2
r2:
add $t7 , $a0 , -1 # n-1
bge $t0 , $t7 , done # if (i>= n-1) skip

sll $s2 , $t0 , 2  # i * 4
add $a1 , $s3 , $s2 # &array + (i*4) (address of the ith value)
#add $a1 , $t8 , $0  # address of the ith element
add $a0 , $t7 , $0  # n = n-1
jal sort_loop


done :
lw $ra , 0($sp) # return address
lw $a0 , 4($sp) # n
lw $a1 , 8($sp) # array address
lw $t0 , 12($sp) # i
add $sp , $sp , 16 # unallocationg
jr $ra

因此它可以正常工作并进行排序,但在某些元素上却无法工作 就像我输入10 9 8 7 6 5 4 3 21 它会排序,但如果 10 9 6 4 5 3 2 1 8 7 它会显示这个 output

除非原始的给定代码是错误的,否则我不明白为什么。 希望我能得到帮助:) (我的截止日期是30小时>。>)

谢谢^ _ ^

1 个答案:

答案 0 :(得分:0)

所以解决方案是这样

np.linspace()

我应该在修改后存储(i)

而且我根本不需要重新加载地址,这是我最大的错误

我需要重新加载第二次递归的n和i值

请阅读并尝试帮助的人