bubble-sort - 具有可变输入数量的冒泡排序
问题描述
我正在为 Little Man Computer 开发一个冒泡排序程序,我希望它具有可变数量的输入(如 500 个),之后程序将停止接受输入并将值从最小到最大排序。
请注意,在冒泡排序中应接受零作为数字。因此,如果输入是 3、5、6、0,那么它应该将它们排序为 0、3、5、6。
解决方案
这个想法是将第一个输入保留为其余输入的长度。通过这种方式,您可以知道何时采用了所有值。所以在你的例子中:
3 5 6 0
实际输入值必须是
4 3 5 6 0
...其中 4 告诉我们后面有 4 个数据值。
所以这意味着该程序将以以下内容开始:
INP
BRZ quit ; nothing to do
STA size
; .... other code ....
quit HLT
size DAT
然后代码需要使用它size
来初始化一个计数器,并获取剩余的输入
LDA size
SUB one
loop STA counter
INP ; take the next input
; .... process this value ....
LDA counter ; decrement the counter
SUB one
BRP loop ; while no underflow: repeat
; ... other processing on the collected input ...
quit HLT
counter DAT
当您有多个(可能是嵌套的)循环时,就像冒泡排序的情况一样,您将不得不管理多个计数器。
应用于冒泡排序
在这个答案中,您将找到一个冒泡排序的实现,其中输入需要以 0 终止。在这里,我为您提供该解决方案的变体,其中 0 不再用作输入终止符,但第一个输入表示长度输入中跟随的值数组。
请注意,这会使代码稍长一些,因此用于存储输入数组的剩余空间会变小:这里只有 25 个邮箱可供数组使用。在标准 LMC 上,永远不可能存储 500 个输入,因为总共只有 100 个邮箱,而代码占用了其中一些邮箱。
在算法中(加载输入后),外循环需要迭代大小-1次,内循环每次外循环迭代一次需要少迭代一次(这是冒泡排序的标准原理) .
#input: 10 4 3 2 1 0 9 8 5 6 7
LDA setfirst
STA setcurr1
INP
BRZ zero ; nothing to do
SUB one
STA size ; actually one less
input STA counter1
INP
setcurr1 STA array
LDA setcurr1
ADD one
STA setcurr1
LDA counter1
SUB one
BRP input
LDA size
BRA dec
sort STA counter1
LDA getfirst
STA getcurr1
STA getcurr2
LDA setfirst
STA setcurr2
LDA cmpfirst
STA cmpcurr
LDA counter1
loop STA counter2
LDA getcurr1
ADD one
STA getnext1
STA getnext2
LDA setcurr2
ADD one
STA setnext
getnext1 LDA array
cmpcurr SUB array
BRP inc
getcurr1 LDA array
STA temp
getnext2 LDA array
setcurr2 STA array
LDA temp
setnext STA array
inc LDA getnext1
STA getcurr1
LDA setnext
STA setcurr2
LDA cmpcurr
ADD one
STA cmpcurr
LDA counter2
SUB one
BRP loop
LDA counter1
dec SUB one
BRP sort
LDA size
output STA counter1
getcurr2 LDA array
OUT
LDA getcurr2
ADD one
STA getcurr2
LDA counter1
SUB one
BRP output
zero HLT
one DAT 1
getfirst LDA array
setfirst STA array
cmpfirst SUB array
size DAT
counter1 DAT
counter2 DAT
temp DAT
array DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.77/lmc.js"></script>
推荐阅读
- matlab - 是否可以使用 gpuArray 预分配一个数组,并在 mexcuda 设置中对其具有写权限?
- ubuntu - 如何修复 Xubuntu 中的 spyder 分段错误?
- c# - 绘制矩形 C# WPF 后如何从特定角更新此值
- android - Room 2 dao 的交易是真的吗?
- html - 带有对齐和嵌套结构的纯 CSS 浮动
- react-leaflet - 反应传单。单击绘制的多边形时停止传播
- ios - 如何使用适用于 Cognito 的 AWSCognitoIdentityProvider ios SDK 在访问令牌中定义范围
- sql-server - SQL 优化
- java - 隐藏核心逻辑并仅向应用程序显示包装器 API
- reactjs - 材质 UI 单选按钮