在MIPS中一次以降顺序2进行排序

发布于 2025-02-07 18:41:13 字数 2717 浏览 1 评论 0原文

# read 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers

# i in register $t0,
# registers $t1 - $t3 used to hold temporary results

main:

    li   $t0, 0         # i = 0
loop0:
    bge  $t0, 10, end0  # while (i < 10) {

    li   $v0, 5         #   scanf("%d", &numbers[i]);
    syscall             #

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers   #
    add  $t3, $t1, $t2  #
    sw   $v0, ($t3)     #   store entered number in array

    addi $t0, $t0, 1    #   i++;
    j    loop0          # 
end0:
    # PUT YOUR CODE HERE

    li   $t0, 1         # i = 1

loop1:
    bge  $t0, 10, end1  #   if (i >= 10) goto end1

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers   #
    add  $t3, $t1, $t2  #
    lw   $a0, ($t3)     #   load numbers[i] into $a0 (x)

    sub $t4, $t3, 4     
    lw  $a1, ($t4)      #load numbers[i - 1] into $a1 (y)

    bge $a0, $a1, increment #if (x >= y) goto increment

    add $t5, $a1, $zero       #store y in a temp variable
    add $a1, $a0, $zero       # numbers[i] = y
    add $a0, $t5, $zero       # numbers[i - 1] = x


increment:
    add  $t0, $t0, 1    #   i++
    j    loop1          

end1:
    li  $t0, 0          #i = 0

loop2:
    bge  $t0, 10, end2  #if (i >= 10) goto end2

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers #
    add  $t3, $t1, $t2  #
    lw   $a0, ($t3)     #   load numbers[i] into $a0 

    li   $v0, 1         #   printf("%d", numbers[i])
    syscall

    li   $a0, '\n'      #   printf("%c", '\n');
    li   $v0, 11
    syscall

    add  $t0, $t0, 1    #i++;
    j   loop2

end2:
    li   $v0, 0
    jr   $ra            # return 0

.data

numbers:
    .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  # int numbers[10] = {0};

这是我到目前为止编写的代码,它仅打印出给定的数组,并且不会重新排序它们。我有一种感觉,我在loop2中的某个地方覆盖交换,但我不确定在哪里。如何解决此问题以使其以简单的方式工作?

功能: #将10个数字读取为一个数组 #交换所有不订单的数字对 #然后打印10个数字

示例

输入:12086,24363,47363,64268,34001,6800,6800,60742,48867,26002,54999

输出>输出: 12086、24363、47363、34001、6800、60742、48867、26002、54999、64268

等效c程序:

 #include <stdio.h>

int main(void) {
    int i;
    int numbers[10] = { 0 };

    i = 0;
    while (i < 10) {
        scanf("%d", &numbers[i]);
        i++;
    }

    i = 1;
    while (i < 10) {
        int x = numbers[i];
        int y = numbers[i - 1];
        if (x < y) {
            numbers[i] = y;
            numbers[i - 1] = x;
        }
        i++;
    }

    i = 0;
    while (i < 10) {
        printf("%d\n", numbers[i]);
        i++;
    }
}
# read 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers

# i in register $t0,
# registers $t1 - $t3 used to hold temporary results

main:

    li   $t0, 0         # i = 0
loop0:
    bge  $t0, 10, end0  # while (i < 10) {

    li   $v0, 5         #   scanf("%d", &numbers[i]);
    syscall             #

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers   #
    add  $t3, $t1, $t2  #
    sw   $v0, ($t3)     #   store entered number in array

    addi $t0, $t0, 1    #   i++;
    j    loop0          # 
end0:
    # PUT YOUR CODE HERE

    li   $t0, 1         # i = 1

loop1:
    bge  $t0, 10, end1  #   if (i >= 10) goto end1

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers   #
    add  $t3, $t1, $t2  #
    lw   $a0, ($t3)     #   load numbers[i] into $a0 (x)

    sub $t4, $t3, 4     
    lw  $a1, ($t4)      #load numbers[i - 1] into $a1 (y)

    bge $a0, $a1, increment #if (x >= y) goto increment

    add $t5, $a1, $zero       #store y in a temp variable
    add $a1, $a0, $zero       # numbers[i] = y
    add $a0, $t5, $zero       # numbers[i - 1] = x


increment:
    add  $t0, $t0, 1    #   i++
    j    loop1          

end1:
    li  $t0, 0          #i = 0

loop2:
    bge  $t0, 10, end2  #if (i >= 10) goto end2

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers #
    add  $t3, $t1, $t2  #
    lw   $a0, ($t3)     #   load numbers[i] into $a0 

    li   $v0, 1         #   printf("%d", numbers[i])
    syscall

    li   $a0, '\n'      #   printf("%c", '\n');
    li   $v0, 11
    syscall

    add  $t0, $t0, 1    #i++;
    j   loop2

end2:
    li   $v0, 0
    jr   $ra            # return 0

.data

numbers:
    .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  # int numbers[10] = {0};

This is the code I have written so far, and it only prints out the given array and does not reorder them. I have a feeling I am overwriting the swapping somewhere in loop2 but I am not sure where. How can I fix this to make it work in a simple way?

Functionality:
# reads 10 numbers into an array
# swap any pairs of of number which are out of order
# then print the 10 numbers

example

input: 12086, 24363, 47363, 64268, 34001, 6800, 60742, 48867, 26002, 54999

output:
12086, 24363, 47363, 34001, 6800, 60742, 48867, 26002, 54999, 64268

An equivalent C program:

 #include <stdio.h>

int main(void) {
    int i;
    int numbers[10] = { 0 };

    i = 0;
    while (i < 10) {
        scanf("%d", &numbers[i]);
        i++;
    }

    i = 1;
    while (i < 10) {
        int x = numbers[i];
        int y = numbers[i - 1];
        if (x < y) {
            numbers[i] = y;
            numbers[i - 1] = x;
        }
        i++;
    }

    i = 0;
    while (i < 10) {
        printf("%d\n", numbers[i]);
        i++;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文