排序算法:插入排序 - 讲座中给出的伪代码似乎是错误的

时间:2017-02-09 15:52:44

标签: algorithm sorting pseudocode

我参加了一个叫做算法的基本课程。我们正在研究排序算法;我们给出了以下伪代码作为插入排序算法的示例。不过我认为这是错误的。

item: Set Variable
  Variable=MAINDIR
  Value=C:\MyApp
end
item: Set Variable
  Variable=COMPANY
end
item: Set Variable
  Variable=SERIAL
end
item: Read INI Value
  Variable=COMPANY
  Pathname=%MAINDIR%\MyAppSettings.ini
  Section=settings
  Item=COMPANY
end
item: Read INI Value
  Variable=SERIAL
  Pathname=%MAINDIR%\MyAppSettings.ini
  Section=settings
  Item=SERIALNUMBER
end
item: Custom Dialog Set
  Name=My App Settings
  item: Dialog
    Title=My App Settings
    Width=290
    Height=238
    Font Name=Helv
    Font Size=8
    item: Static
      Rectangle=5 5 105 20
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000000000000000000000
      Text=Company Name
    end
    item: Editbox
      Rectangle=114 7 230 22
      Help Context=16711681
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000100000010000000000000000
      Text=%COMPANY%
    end
    item: Static
      Rectangle=5 25 105 40
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000000000000000000000
      Text=Serial Number
    end
    item: Editbox
      Rectangle=114 26 230 41
      Help Context=16711681
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000100000010000000000000000
      Text=%SERIAL%
    end
    item: Push Button
      Rectangle=182 145 217 160
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000010000000000000000
      Text=&Next
    end
  end
end

你也可以在这个截图中的讲义中看到它: insertion

我理解第一行 - 它从2开始,因为第一张卡是"已经订购",因为它是迄今为止唯一的卡。

第二行是错误的吗?怎么可能我们使用j从i到2?当然,这在未来不可能成立。此外,不应该缩小中断吗?所以只有一个标签而不是2?

修改

这是"主要想法"算法。正如你所看到的那样,索引j的范围似乎错了。 insertion2

EDIT2 所以在这里我尝试写下我脑海中发生的事情,阅读这个伪代码: 假设我有列表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 。我会写(5,3,8,7,2,4,1,6)来分隔&#34;手&#34;在甲板上,我也会写|来强调我正在看哪个元素。所以我们走了:

5_

如你所见,从现在开始这将永远发生,因为我们从2​​开始,因为我们打破它!因此,即使j的整数集增加,我们也不能再进一步2,因为我们只是违反了条件

2 个答案:

答案 0 :(得分:3)

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

  • 长度为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

答案 1 :(得分:2)

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

这个SO帖子有一个很好的可视化: Insertion Sort vs. Selection Sort