我会看看我能为你做些什么。代码,供参考:
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 作为它的索引,它从 1 开始,value
实际上 array[1] 也是如此,并且last_value
是array[1-1]
or array[0]
。
if value<last_value:
array[i]=last_value
array[i-1]=value
所以现在我们正在比较这些值。假设我们通过了[3, 1, 3, 2, 6, 4]
. 我们处于循环的第一次迭代,所以我们本质上是说,如果array[1]
1 小于array[0]
3,则交换它们。当然 1 小于 3,所以我们交换它们。但由于代码只能将每个项目与前一个项目进行比较,因此无法保证array
从最低到最高正确排序。如果后面的项目更大,则每次迭代都可以取消交换正确交换的项目(例如,[2,5,6,4] 在前两次迭代中将保持不变——它们将被if
测试跳过——但是当它击中第三个,6 将与 4 交换,这仍然是错误的)。事实上,如果我们要在不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]
你看到发生了什么事吗?如果我们只看每次迭代的变化如何:
[3, 1, ... # Wrong; swap. Further work ceases; recur (return to beginning with a fresh call to my_sort()).
[1, 3, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 6, 4 # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 4, 6] # All numbers all smaller than following number; correct.
这允许该函数根据需要将一个数字从后面拉到前面来多次调用自己。同样,每次调用它时,它都会关注第一个错误的实例,将其向左拉,直到将其放置在正确的位置。希望有帮助!如果您仍然遇到问题,请告诉我。