Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 排序算法:插入排序-讲座中给出的伪代码似乎是错误的_Algorithm_Sorting_Pseudocode - Fatal编程技术网

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

Algorithm 排序算法:插入排序-讲座中给出的伪代码似乎是错误的,algorithm,sorting,pseudocode,Algorithm,Sorting,Pseudocode,我在上一门叫做算法的基础课。我们正在研究排序算法;我们得到了以下伪代码作为插入排序算法的示例。然而我认为这是错误的 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开始,因为我们打破了它!因此,即使j的整数集增加,我们也不能再继续2,因为我们只是违反了条件,如果您做出以

我在上一门叫做算法的基础课。我们正在研究排序算法;我们得到了以下伪代码作为插入排序算法的示例。然而我认为这是错误的

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开始,因为我们打破了它!因此,即使j的整数集增加,我们也不能再继续2,因为我们只是违反了条件,如果您做出以下假设,代码是有效的:

  • 长度
    N
    的数组具有索引
    1..N
  • For循环覆盖指定范围,无论方向如何;因此,{a,…,b}中x的
    将通过
    a,a+1,a+2,…,b-1,b,如果a=b

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

  • 长度
    N
    的数组具有索引
    1..N
  • For循环覆盖指定范围,无论方向如何;因此,{a,…,b}中x的
    将通过
    a,a+1,a+2,…,b-1,b,如果a=b

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

      这篇文章有很好的可视化效果:
      第二行不是错误,因为您试图获取第i个元素(在外循环上运行)并将其插入前面的分区中。然后,您必须将该元素与之前的分区进行比较,以便对其进行排序

      这篇文章有很好的可视化效果:

      这是伪代码,因此无法判断
      循环的
      步进方向。。。如果在第二个
      For
      中,步长为
      -1
      ,则可以看到代码是正确的。然而,没有任何介绍,这是相当模糊的伪代码。编辑后,很明显您想在第二个循环中后退。@BeyelerStudios,我想了一个负步骤。然而,它仍然不起作用。因为每当你“向手中添加一张新卡”时,你都需要将这张卡与手中的每一张卡一起检查,而不仅仅是从第二张开始!此外,每次插入卡时,都会浪费时间,因为您必须再次检查已检查的所有卡。2美元肯定是一个好价钱mistake@BeyelerStudios,好吧,那么你如何解释我的例子在新编辑中发生了什么呢?@BeyelerStudios哦,好吧,现在有道理了!这是伪代码,因此无法判断
      For
      循环中的步进方向。。。如果在第二个
      For
      中,步长为
      -1
      ,则可以看到代码是正确的。然而,没有任何介绍,这是相当模糊的伪代码。编辑后,很明显您想在第二个循环中后退。@BeyelerStudios,我想了一个负步骤。然而,它仍然不起作用。因为每当你“向手中添加一张新卡”时,你都需要将这张卡与手中的每一张卡一起检查,而不仅仅是从第二张开始!此外,每次插入卡时,都会浪费时间,因为您必须再次检查已检查的所有卡。2美元肯定是一个好价钱mistake@BeyelerStudios,好吧,那么你如何解释我的例子在新编辑中发生了什么呢?@BeyelerStudios哦,好吧,现在有道理了!对不起,我不明白你所说的“outter循环”和“在它之前分区”是什么意思。顾名思义,你在一个已经排序的列表中插入了一个元素。这就是为什么总是从数组中的第二个元素开始,因为第一个元素已经排序。所以我的意思是,在这种情况下,“先分割后分割”只是第一个元素。但从2开始,到I,这不只是一个巨大的重复动作吗?每次在列表中插入新元素时,您都会再次检查列表中的每个元素及其旁边的元素,这是您以前已经做过的是。这就是为什么插入排序的最坏情况是N^2。然后用“排序列表”检查要插入的元素。假设您要插入第i个元素,您希望与第i-1th个元素进行比较和交换,然后是第i-2th个元素,依此类推,直到您使列表再次排序。对不起,我不理解您所说的“outter循环”和“之前的分区”是什么意思。顾名思义,您将一个元素插入到已排序的列表中。这就是为什么总是从数组中的第二个元素开始,因为第一个元素已经排序。所以我的意思是,在这种情况下,“先分割后分割”只是第一个元素。但从2开始,到I,这不只是一个巨大的重复动作吗?每次在列表中插入新元素时,您都会再次检查列表中的每个元素及其旁边的元素,这是您以前已经做过的是。这就是为什么插入排序的最坏情况是N^2。然后用“排序列表”检查要插入的元素。假设您要插入第i个元素,您希望与第i-1th个元素进行比较和交换,然后是第i-2th个元素,依此类推,直到您再次对列表进行排序。
      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