我正在上一门名为算法的基础类(class)。我们正在研究排序算法;我们得到了以下伪代码作为插入排序算法的示例。但是我认为这是错误的。
For i in {2,..,n}:
For j in {i,..,2}:
If a(j)<a(j-1), swap a(j) and a(j-1)
Else, Break
我理解第一行 - 它从 2 开始,因为第一张卡“已订购”,因为它是迄今为止唯一的一张卡。
第二行写错了吗?从 i 到 2 怎么可能用 j 呢?当然,这在未来是行不通的。另外,休息时间不应该减少缩进吗?所以只有一个选项卡而不是两个?
编辑
这里是算法的“主要思想”。如您所见,索引 j 的范围从这里看起来是错误的。
编辑2
所以在这里我试着写下我脑海中发生的事情,阅读这个伪代码:
假设我有列表 (5,3,8,7,2,4,1,6)
。我会写 |
来将“手”与牌组分开,我还会写 5_
来强调我正在看的是哪个元素。所以我们开始吧:
i = 1, (5|3,8,7,2,4,1,6)
i = 2, (5,3|8,7,2,4,1,6), now j in {2}, so we only have j = 2, a(j=2)=3 < a(j=1)=5, hence swap 3 with 5
i = 3, (3,5,8|7,2,4,1,6), j in {2,3}, so j=2 gives a(j=2)=5 !< a(j=1)=3 SO WE BREAK!
i = 4, (3,5,8,7|2,4,1,6), j in {2,3,4}, so j = 2 gives a(j=2)=5 !< a(j=1)=3, SO WE BREAK
正如您所见,从现在开始这将一直发生,因为我们从 2 开始,因为我们打破了它!所以即使 j 的整数集增加了,我们也不能再进一步 2,因为我们刚好违反了条件
最佳答案
如果您做出以下假设,则代码有效:
- 一个长度为
N
的数组有索引1..N
- for循环覆盖指定范围,不考虑方向;因此,
for x in {a,...,b}
将通过a, a+1, a+2, ..., b-1, b if a <= b
, 但通过a, a-1, a-2, ..., b+1 b if a >= b
.
关于algorithm - 排序算法 : Insertion sort - Pseudocode given in lectures seems wrong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42141159/