我不确定我的代码是如何工作的,我是初学者,没有太多经验
def insertion_sort(array):
print(f'Initiales Array: {array}')
for i in range(1, len(array)):
temp = array[i]
j = i
while j > 0 and array[j - 1] > temp:
array[j] = array[j - 1]
j -= 1
array[j] = temp
print(f'Nach i={i}, Array: {array}')
return array
data = [4, 1, 8, -3, 5, 7]
insertion_sort(data)
理解一段代码的最好方式,尤其是对于初学者来说,是将其可视化并一步一步地跟踪其执行。让我们分解一下你的插入排序代码:
插入排序:概述
插入排序算法的工作原理类似于你整理手中的扑克牌。你一次拿起一张牌,并在已经排序好的牌中找到它的正确位置,然后将其插入。
代码逐行分析
def insertion_sort(array):
print(f'Initiales Array: {array}')
for i in range(1, len(array)):
temp = array[i]
j = i
while j > 0 and array[j - 1] > temp:
array[j] = array[j - 1]
j -= 1
array[j] = temp
print(f'Nach i={i}, Array: {array}')
return array
data = [4, 1, 8, -3, 5, 7]
insertion_sort(data)
-
def insertion_sort(array):
: 这行代码定义了一个名为insertion_sort
的函数,该函数接收一个名为array
的列表作为输入。 这是我们将对数据执行排序的函数。 -
print(f'Initiales Array: {array}')
: 这行代码在开始之前打印出初始数组 - 对了解算法是如何进行的很有帮助。 -
for i in range(1, len(array)):
: 这行代码启动了一个循环,该循环遍历数组。i
的值将从索引 1(数组的第二个元素)到数组的最后一个元素。变量i
表示“已排序子数组”中最后一个元素的索引。 -
temp = array[i]
: 这行代码将当前元素array[i]
存储到名为temp
的临时变量中。这是因为我们将对array[i]
左侧的元素进行一些移位,并且我们需要记住array[i]
的值以供以后插入。 -
j = i
: 我们创建一个名为j
的新变量,并将其初始化为i
的值。j
用于在已排序子数组中向后迭代,以找到temp
的正确位置。 -
while j > 0 and array[j - 1] > temp:
: 此循环在以下两个条件均为真时运行: -
j > 0
: 确保我们不会超出数组的左边界。 -
array[j - 1] > temp
: 检查已排序子数组中的元素 (array[j - 1]
) 是否大于temp
。 如果为真,则表示temp
需要向左移动以找到其正确位置。 -
array[j] = array[j - 1]
: 如果前一个条件为真,则将较大的元素(array[j - 1]
)向右移动一个位置以腾出空间。 -
j -= 1
: 我们将j
减 1 以便在已排序子数组中向左移动。 -
array[j] = temp
: 找到temp
的正确位置后(即,它不再小于左侧的元素),我们将其插入到j
索引处。 -
print(f'Nach i={i}, Array: {array}')
: 此行代码打印当前迭代后的数组。这对于可视化算法是如何一步一步对数组进行排序很有帮助。 -
return array
: 排序完成后,函数将返回已排序的数组。
示例执行
让我们用你的示例数据
[4, 1, 8, -3, 5, 7]
逐步执行代码:
迭代 1:
i = 1
-
temp = 1
- 将
1
与
4
进行比较。
1
小于
4
,因此将
4
向右移动,并将
1
插入到其正确位置。
- 数组现在变为:
[1, 4, 8, -3, 5, 7]
迭代 2:
i = 2
-
temp = 8
-
8
已经在其正确位置,因为它是已排序子数组 (
[1, 4]
) 中最大的元素。
- 数组保持不变:
[1, 4, 8, -3, 5, 7]
迭代 3:
i = 3
-
temp = -3
- 将
-3
与
8
、
4
和
1
进行比较,并将这些元素向右移动,直到找到
-3
的正确位置。
- 数组现在变为:
[-3, 1, 4, 8, 5, 7]
迭代 4、5 和 6
以类似的方式继续,将剩余的元素
5
和
7
插入到其正确位置,直到对整个数组进行排序。
调试技巧
-
打印语句:
像代码中那样,在代码的各个点添加
print
语句,以查看变量的值和数组在每个步骤中的状态。 - 调试器: 使用调试器可以让你逐步执行代码、设置断点并在每个步骤检查变量,从而更深入地了解代码的执行流程。
可视化
网上有许多资源可以提供插入排序的可视化表示。在 YouTube 或其他网站上搜索“插入排序可视化”,以找到有助于你理解该算法的动画。
请记住,练习是关键。尝试使用不同的输入数据集手动执行代码,并使用
print
语句或调试器来观察代码的行为。随着时间的推移,你将对插入排序以及其他排序算法有更深入的理解。