def my_sort(array):
length_of_array = range(1, len(array))
for i in length_of_array:
value = array[i]
last_value = array[i-1]
if value<last_value:
array[i]=last_value
array[i-1]=value
my_sort(array)
return array
我知道这个功能一般来说是做什么的。它是一种排序算法....但我不知道每个部分/部分的作用。
答案 0 :(得分:3)
好吧,我必须说最好的方式来理解这一点,就是试验它,了解它的用途,并且基本上学习Python。 :)
但是,我将逐一介绍这些内容以提供帮助:
定义一个名为my_sort
的{{3}},它接受一个名为array
的参数。其余行包含在此函数中。
使用function创建一系列数字,其范围从1
开始,到array
非包含的长度。然后,将此范围分配给变量length_of_array
。
启动range
,迭代上一行中定义的范围。此外,将返回的每个数字分配给变量i
。这个for循环包含第4到第9行。
创建一个变量value
,该变量等于位置array
的{{3}} i
返回的项目。
创建一个变量last_value
,该变量等于array
位置i-1
索引返回的项目。
测试value
是否小于last_value
。如果是这样,请执行第7行到第9行。
使i
的{{1}}索引等于array
。
使last_value
的{{1}}索引等于i-1
。
重新运行array
for-loop,传递参数value
。
为递归函数的这次迭代返回my_sort
。
当最终对array
进行排序时,递归将结束,并且您将留下array
所有的好并且已排序。
我希望这能说明这个问题!
答案 1 :(得分:0)
我会看到我能为你做些什么。代码,供参考:
def my_sort(array):
length_of_array = range(1, len(array))
for i in length_of_array:
value = array[i]
last_value = array[i-1]
if value<last_value:
array[i]=last_value
array[i-1]=value
my_sort(array)
return array
def my_sort(array):
将数组作为参数的函数。
length_of_array = range(1, len(array))
我们根据length_of_array
中的项目数将变量range
设置为我们可以迭代的array
个数字。我假设您知道range
的作用,但如果不这样做,简而言之,您可以按照迭代列表的方式迭代它。 (你也可以在这里使用xrange()
。)
for i in length_of_array:
value = array[i]
last_value = array[-1]
我们正在做的是使用range
间接遍历数组,因为每个数组中的项目总数相同。但是,如果我们仔细观察,value
使用i
作为索引,从1开始,因此value
实际上是数组[1],而last_value
是{ {1}}或array[1-1]
。
array[0]
所以现在我们正在比较价值观。假设我们通过了 if value<last_value:
array[i]=last_value
array[i-1]=value
。我们处于循环的第一次迭代,所以我们基本上说,如果[3, 1, 3, 2, 6, 4]
为1,则小于array[1]
,即3,交换它们。当然1小于3,所以我们交换它们。但由于代码只能将每个项目与前一项目进行比较,因此无法保证array[0]
将从最低到最高排序。如果后面的项目较大(例如[2,5,6,4]在前两次迭代中保持不变,则每次迭代都可以取消交换正确交换的项目 - 它们将被array
测试跳过 - 但是当它击中第三个时,6将与4交换,这仍然是错误的)。事实上,如果我们在没有直接呼叫if
的情况下完成此操作,我们原来的my_sort(array)
将评估为array
。不太对劲。
[1, 3, 2, 3, 4, 6]
所以我们递归地调用 my_sort(array)
。我们基本上说的是,如果在第一次迭代中出现问题,请更正,然后将新的my_sort()
传递回array
。这听起来很奇怪,但它确实有效。如果my_sort()
测试根本没有满足,那就意味着我们原始列表中的每个项目都小于下一个,这是另一种方式(计算机的方式,真的)说它按升序排序开始用。 那是关键。因此,如果任何列表项小于前面的项,我们将其左侧一个索引拉出来。但我们真的不知道 是否正确 - 也许它还需要更进一步。所以我们必须回到起点(即,在我们新推出的列表上再次调用if
),然后重新检查以确定是否应该再次将其拉出来。如果我们不能,my_sort()
测试失败(每个项目小于下一个项目),直到它遇到下一个错误。在每次迭代中,这会向左移动一个索引向左相同的较小数字,直到它处于正确的位置。这听起来比实际上更令人困惑,所以让我们看一下每次迭代的输出:
if
你看到发生了什么事吗?如果我们只看每次迭代的变化,那该怎么样:
[3, 1, 3, 2, 6, 4]
[1, 3, 3, 2, 6, 4]
[1, 3, 2, 3, 6, 4]
[1, 2, 3, 3, 6, 4]
[1, 2, 3, 3, 4, 6]
这允许函数多次调用自身,从而将数字从后面拉到前面。同样,每次调用它时,它都会关注第一个错误的实例,向左拉一个直到它将其置于正确的位置。希望有所帮助!如果你还有问题,请告诉我。