首页 > 解决方案 > 我的排序算法有什么问题?

问题描述

我编写了一个函数max,它获取列表的最大值并将其地址$v0和值保存在$v1. 我还编写了一个函数swap来交换两个地址之间的值和另一个函数,它只是在$a0和中打印值$a1

现在我将列表中的值从最低到最大值排序。为此,我使用了sort我在 中给出了起始地址$a0和在$a1. 我的想法是:

  1. 我用max
  2. 我把最大的地址放入$a0
  3. 我交换和之间的$a0$a1
  4. 我再次放入$a0起始地址list1

这是我的问题所在。我尝试了很多不同的东西,但我不明白,我真的不明白问题出在哪里。

  1. 我想用里面的地址替换,$a1, 4 然后再次对较小的列表进行排序,直到地址在$a0 == $a1

  2. 跳转到排序。


    .data
list:   .word 9, 8, 7, 3, 6, -4, 3, -1
list1:  .word 2, 5, 33, 4, 77, 22, 345, 88, 7, 99
list2:  .word 3, 5, 444, -4, 357, 23452, 1, -4588, 45, 38
list3:  .word 3, 345, 33, -43, -37, -34522, 1, -88, 5, 8
n:  .asciiz "\n"
    .text


main:

    la  $a0     list
    la  $a1     list+28 

    jal     print
    jal     swap
    jal     print


#######--------------------------------Start searching biggest Value in list1 list2 list3-----------------#########################

    la  $a0     list1
    la  $a1     list1+120
    jal     max
    add     $a0 $v1 $zero
    li  $v0 1
    syscall
    la  $a0 n
    li  $v0 4
    syscall

    ###-----sort---####


    la  $a0 list1
    la  $a1 list1+36
    j   sort
sorted: 

    li  $v0     10
    syscall
swap:

    lw  $t0     ($a0)
    lw  $t1 ($a1)
    sw  $t0     ($a1)
    sw  $t1     ($a0)   
    jr  $ra





max:

    lw      $t0 ($a0)
    la  $v0 ($a0)
    lw  $v1 ($a0)

do: 

        lw  $t4 ($a0)
    slt $t1 $t0 $t4         
    bgtz    $t1 change              
    la  $a0 4($a0)          
    beq $a0 $a1 finish          
    j   do

change: 

        lw  $t0 ($a0)
    la  $v0 ($a0)
    lw  $v1 ($a0)
    la  $a0 4($a0)
    j   do

finish: 

         jr $ra





print:

    la $t0 ($a0)    
    lw $a0 ($a0)
    li $v0 1
    syscall
    la $a0 n
    li $v0 4
    syscall
    lw $a0 ($a1)
    li $v0 1
    syscall
    la $a0 n
    li $v0 4
    syscall
    la $a0 ($t0)        
    jr $ra




sort:   

    jal max
    move    $a0 $v0
    jal swap
    jal     print

    la  $a0 list1
    sub $a1 4

    beq $a0 $a1  sorted
    j   sort

标签: assemblymips

解决方案


推荐阅读