气泡排序进入无限循环

问题描述

我正在尝试使用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。

解决方法

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

请参阅以下更正中的注释:

#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个值进行排序的问题。但是,如果您正在寻找一种可以输入可变数量的值并将其排序的解决方案,请查看以下答案: