algorithm - 排序算法 : Insertion sort - Pseudocode given in lectures seems wrong

标签 algorithm sorting pseudocode

我正在上一门名为算法的基础类(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

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

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

第二行写错了吗?从 i 到 2 怎么可能用 j 呢?当然,这在未来是行不通的。另外,休息时间不应该减少缩进吗?所以只有一个选项卡而不是两个?

编辑

这里是算法的“主要思想”。如您所见,索引 j 的范围从这里看起来是错误的。 insertion2

编辑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/

相关文章:

php - 按时间顺序对 MySQL 记录进行排序?

python - 使用python和tornado根据mongodb中的日期对列表进行排序

c - 输出以一种奇怪的方式排序

c# - 如何用伪代码写前置条件

algorithm - 时间复杂度作为输入位数的函数来衡量?

javascript - 如何优化编辑距离来检查距离为 1?

python - 使用另一个线集合裁剪线集合

algorithm - 简单范围搜索算法的伪代码

algorithm - 当你只有一大组输入/输出对时,你如何找到函数的定义?

algorithm - 函数导数