插入排序python算法:为什么我们要从i中减去1?

wwtsj6pe  于 2022-11-27  发布在  Python
关注(0)|答案(4)|浏览(145)

代码如下:

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的逻辑。有人能解释一下吗?

dgtucam1

dgtucam11#

在插入排序中,选择每一个值,向后放置到小于右部而大于左部的相应位置。
也许这个来自维基媒体的gif描述得很好。如果嵌入的gif不起作用,请看链接:https://upload.wikimedia.org/wikipedia/commons/9/9c/Insertion-sort-example.gif

因此,你需要i = i-1返回wrd并放置在正确的位置。

mw3dktmi

mw3dktmi2#

大家好,欢迎来到SO,
python中的range(a, b)等效于数学中的[a, b[,其中ab是两个浮点数,a < b
range(b)在数学上等价于[0, b[

5t7ly7z5

5t7ly7z53#

Without,i=i-1相邻的元素被检查一次。所以,在结束时[2,3,5,7,4,1]将变成[2,3,5,4,1,7]。为了使它工作(没有i = i-1),你需要像下面这样实现双for循环,并可以用if condition替换while loop或保持原样。

def insertion_sort(list_a):
  indexing_length = range(1,len(list_a))
  #this is double for-loop
  for _ in indexing_length:
      for i in indexing_length:
        # print(i)
        value_to_sort = list_a[i]
        if list_a[i-1] > value_to_sort and i>0:
          list_a[i], list_a[i-1] = list_a[i-1], list_a[i]  
        print(list_a)
  
  return list_a

实际上,上述方法是很容易理解和教导无处不在,我们检查每两个相邻的元素两次,但要减少比较检查的数量,我们可以使用while循环与i = i-1.

gr8qqesn

gr8qqesn4#

请考虑以下示例:arr = [12, 11, 13, 5, 6]
数组实际上被拆分为已排序部分和未排序部分。未排序部分中的值被选取并放置在已排序部分中的正确位置。

第一遍:

从前两个元素开始

12          11          13          5       6

这里,12大于11,因此它们不是按升序排列的,12的位置也不正确。因此,交换11和12。因此,现在11存储在一个已排序的子数组中。

第二遍:

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

11          12          13          5       6

这里,13大于12,因此两个元素看起来都是升序的,因此不会发生交换。12也与11沿着存储在已排序的子数组中。

第三遍:

现在,我们来看下两个元素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

在这里,它处于正确位置
然后,我们在每一遍中重复相同过程
你可以从例子中看到,当一对元素的顺序不正确时,我们会从当前元素的索引开始向后交换它们,直到它们的顺序正确为止。这就是为什么我们在算法代码中设置i = i - 1

相关问题