【问题标题】:Sorting Algorithm: Insertion sort - Pseudocode given in lectures seems wrong排序算法:插入排序 - 讲座中给出的伪代码似乎是错误的
【发布时间】: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


【解决方案1】:

如果做出以下假设,则代码有效:

  • 长度为N 的数组具有索引1..N
  • 无论方向如何,For 循环都覆盖指定范围;因此,for x in {a,...,b} 将通过a, a+1, a+2, ..., b-1, b if a &lt;= b,但通过a, a-1, a-2, ..., b+1 b if a &gt;= b

【讨论】:

    【解决方案2】:

    第二行不是错误,因为您尝试获取第 i 个元素(在外循环上运行)并插入到它之前的分区中。然后,您必须将此元素与之前的分区进行比较以使其排序。

    这篇 SO 帖子有很好的可视化效果: Insertion Sort vs. Selection Sort

    【讨论】:

    • 对不起,我不明白您所说的“外循环”和“之前的分区”是什么意思。
    • 顾名思义,您将一个元素插入到已排序的列表中。这就是为什么总是从数组中的第二个元素开始,因为第一个元素已经排序。所以在这种情况下,我的意思是“之前的分区”只是第一个元素。
    • 但是从2开始到i,不就是一个巨大的重复动作吗?每次在列表中插入一个新元素时,您都会再次检查列表中的每个元素及其旁边的元素,您之前已经这样做过
    • 是的。这就是为什么插入排序的最坏情况是 N^2。然后您检查您尝试使用“排序列表”插入的元素。因此,假设您正在插入第 i 个元素,您想与第 i-1 个元素进行比较和交换,然后与第 i-2 个元素进行比较和交换,依此类推,直到您再次对列表进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多