【问题标题】:Insertion sort python algorithm: Why do we subtract 1 from i?插入排序 python 算法:为什么我们要从 i 中减去 1?
【发布时间】:2022-11-27 19:28:16
【问题描述】:

这是代码:

list_a = [3,2,5,7,4,1]

def insertion_sort(list_a):
  indexing_length = range(1,len(list_a))

  for i in indexing_length:
    value_to_sort = list_a[i]

    while list_a[i-1] > value_to_sort and i>0:
      list_a[i], list_a[i-1] = list_a[i-1], list_a[i]  
      i = i - 1
  
  return list_a

我理解算法其余部分的逻辑,但我似乎无法理解执行 i = i - 1 的逻辑。有人可以解释一下吗?

【问题讨论】:

    标签: python algorithm insertion-sort


    【解决方案1】:

    您好,欢迎来到 SO,

    python中的range(a, b)相当于数学中的[a, b[ab两个浮点数和a < b

    range(b)等同于数学上的[0, b[

    【讨论】:

    • 出于好奇,您能否分享哪些数学课程或教科书更喜欢这种表示法?我已经多次看到这种奇怪的 [a; b[ 表示半开区间(包括 a,不包括 b),而“规范”表示是 [a; b) - 括号表示包含结束(闭区间),paren - 排除结束(开区间)。
    【解决方案2】:

    在插入排序中,您选择每个值并返回到它小于右侧部分且大于左侧部分的相应位置。

    可能来自维基媒体的这个 gif 很好地描述了它。如果嵌入的 gif 不工作,请查看链接: https://upload.wikimedia.org/wikipedia/commons/9/9c/Insertion-sort-example.gif

    出于这个原因,您需要 i = i -1 向后移动并放置在正确的位置。

    【讨论】:

      【解决方案3】:

      考虑一个例子:arr = [12, 11, 13, 5, 6]

      第一关:

      最初,数组的前两个元素在插入排序中进行比较。

         12          11          13          5       6   
      

      这里,12 大于 11,因此它们不在升序中,并且 12 不在正确的位置。因此,交换 11 和 12。 所以,现在 11 存储在一个排序的子数组中。 11 12 13 5 6

      第二关:

      现在,移动到下两个元素并比较它们

         11          12          13          5       6   
      

      在这里,13 大于 12,因此两个元素似乎都按升序排列,因此不会发生交换。 12 也与 11 一起存储在已排序的子数组中

      第三关:

      现在,排序后的子数组中存在两个元素,分别是 11 和 12 前进到下两个元素,即 13 和 5

         11          12          13          5       6   
      

      5 和 13 都没有出现在正确的位置,所以交换它们

         11          12          5       13          6   
      

      交换后,元素 12 和 5 没有排序,因此再次交换

         11          5       12          13          6   
      

      在这里,11 和 5 再次未排序,因此再次交换

         5       11          12          13          6   
      

      在这里,它处于正确的位置

      我们在每一遍中重复相同的过程

      您可以看到,当一对元素的顺序不正确时,我们会不断交换它们,从当前元素的索引到第一个元素的索引为 0。这就是我们在算法代码中设置 i = i -1 的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 2019-12-31
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多