代码如下:
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的逻辑。有人能解释一下吗?
4条答案
按热度按时间dgtucam11#
在插入排序中,选择每一个值,向后放置到小于右部而大于左部的相应位置。
也许这个来自维基媒体的gif描述得很好。如果嵌入的gif不起作用,请看链接:https://upload.wikimedia.org/wikipedia/commons/9/9c/Insertion-sort-example.gif
因此,你需要i = i-1返回wrd并放置在正确的位置。
mw3dktmi2#
大家好,欢迎来到SO,
python中的
range(a, b)
等效于数学中的[a, b[
,其中a
和b
是两个浮点数,a < b
而
range(b)
在数学上等价于[0, b[
。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
或保持原样。实际上,上述方法是很容易理解和教导无处不在,我们检查每两个相邻的元素两次,但要减少比较检查的数量,我们可以使用while循环与i = i-1.
gr8qqesn4#
请考虑以下示例:
arr = [12, 11, 13, 5, 6]
数组实际上被拆分为已排序部分和未排序部分。未排序部分中的值被选取并放置在已排序部分中的正确位置。
第一遍:
从前两个元素开始
这里,12大于11,因此它们不是按升序排列的,12的位置也不正确。因此,交换11和12。因此,现在11存储在一个已排序的子数组中。
第二遍:
现在,移动到接下来的两个元素并比较它们
这里,13大于12,因此两个元素看起来都是升序的,因此不会发生交换。12也与11沿着存储在已排序的子数组中。
第三遍:
现在,我们来看下两个元素13和5
5和13都没有出现在正确的位置,因此请交换它们
交换后,元素12和5未排序,因此再次交换
这里,11和5再次未排序,因此再次交换
在这里,它处于正确位置
然后,我们在每一遍中重复相同过程
你可以从例子中看到,当一对元素的顺序不正确时,我们会从当前元素的索引开始向后交换它们,直到它们的顺序正确为止。这就是为什么我们在算法代码中设置
i = i - 1
。