首页 > 解决方案 > 冒泡排序 4 个数字

问题描述

我正在尝试使用 LMC 编写冒泡排序代码,而且效果不会太好。

首先它只是永远循环,我无法弄清楚原因,也许一双新鲜的眼睛会有所帮助?

我不确定是否需要添加“排序 4”部分。

        INP
        STO NUM1
        INP 
        STO NUM2
        INP
        STO NUM3
        INP 
        STO NUM4
BEGIN   LDA ZERO
        STA INCRE
        LDA NUM2
        SUB NUM1
        BRP SORT2
        LDA ONE
        STO INCRE
        LDA NUM1
        STO PLHOLDER
        LDA NUM2
        LDA PLHOLDER
        STO NUM2
SORT2   LDA NUM3
        SUB NUM2
        BRP SORT3
        LDA ONE
        STO INCRE
        LDA NUM2
        STO PLHOLDER
        LDA NUM3
        STO NUM2
        LDA PLHOLDER
        STO NUM3
SORT3   LDA NUM4
        SUB NUM3
        BRP OUTPUT
        LDA ONE
        STO INCRE
        LDA NUM2
        STO PLHOLDER
        LDA NUM4
        STO NUM3
        LDA PLHOLDER
        STO NUM4
OUTPUT  LDA INCRE
        BRZ NOINCRE
        BRA BEGIN
NOINCRE LDA NUM1
        OUT
        LDA NUM2
        OUT
        LDA NUM3
        OUT
        LDA NUM4
        OUT
        HLT
NUM1    DAT
NUM2    DAT
NUM3    DAT
NUM4    DAT
INCRE   DAT
PLHOLDER DAT
ONE     DAT 001
ZERO    DAT 000

我为此使用LMC。

标签: little-man-computer

解决方案


该算法很好,但您只有两个小错误:第二个错误是无限循环的原因(对于某些输入)。

请参阅以下更正中的评论:

#input: 4 3 1 2
        INP
        STO NUM1
        INP 
        STO NUM2
        INP
        STO NUM3
        INP 
        STO NUM4
BEGIN   LDA ZERO
        STA INCRE
        LDA NUM2
        SUB NUM1
        BRP SORT2
        LDA ONE
        STO INCRE
        LDA NUM1
        STO PLHOLDER
        LDA NUM2
        STO NUM1    -- was missing
        LDA PLHOLDER
        STO NUM2
SORT2   LDA NUM3
        SUB NUM2
        BRP SORT3
        LDA ONE
        STO INCRE
        LDA NUM2
        STO PLHOLDER
        LDA NUM3
        STO NUM2
        LDA PLHOLDER
        STO NUM3
SORT3   LDA NUM4
        SUB NUM3
        BRP OUTPUT
        LDA ONE
        STO INCRE
        LDA NUM3   -- was wrong
        STO PLHOLDER
        LDA NUM4
        STO NUM3
        LDA PLHOLDER
        STO NUM4
OUTPUT  LDA INCRE
        BRZ NOINCRE
        BRA BEGIN
NOINCRE LDA NUM1
        OUT
        LDA NUM2
        OUT
        LDA NUM3
        OUT
        LDA NUM4
        OUT
        HLT
NUM1    DAT
NUM2    DAT
NUM3    DAT
NUM4    DAT
INCRE   DAT
PLHOLDER DAT
ONE     DAT 001
ZERO    DAT 000

<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>

这也回答了你的第二个问题:

我不确定是否需要添加“排序 4”部分。

不,您不需要另一个这样的部分。由于每个部分都会比较两个连续的数字,因此当您输入 4 个数字时,您只需要 3 个。

通用解决方案

您已经解决了对 4 个值进行排序的问题。但是,如果您正在寻找可以输入可变数量的值并对其进行排序的解决方案,请查看以下答案:


推荐阅读