【发布时间】:2017-02-09 15:52:44
【问题描述】:
我正在上一门名为算法的基础课程。我们正在研究排序算法;我们得到了以下伪代码作为插入排序算法的示例。但是我认为这是错误的。
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 呢?当然,这在未来是不可能成立的。另外,不应该减少缩进吗?所以只有一个标签而不是 2 个?
编辑
这是算法的“主要思想”。如您所见,从这里开始,索引 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,因为我们只是违反了条件
【问题讨论】:
-
这是伪代码,所以无法判断
For循环中的步进方向是什么...你可以看到代码是正确的,如果在第二个For步长为-1。但是,如果没有任何介绍,那是非常模棱两可的伪代码。编辑后,很明显您想在第二个循环中后退。 -
@BeyelerStudios,我想到了一个消极的步骤。但是它仍然无法正常工作。因为每当你“将一张新牌加入手牌”时,你需要将这张牌与手牌中的所有其他牌一起检查,而不仅仅是从第二张开始!
-
另外,每次插入卡片时,都会浪费时间,因为您必须再次检查所有已经检查过的卡片。 2 美元肯定是个错误
-
@BeyelerStudios,好的,但是您如何解释我在新编辑中的示例中发生了什么?
-
@BeyelerStudios 哦,好吧,现在说得通了!
标签: algorithm sorting pseudocode