我会看看我能为你做些什么。代码,供参考:
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))
根据array 中的项目数,我们将变量length_of_array 设置为可以迭代的数字range。我假设你知道range 做了什么,但如果你不知道,简而言之,你可以像迭代列表一样迭代它。 (你也可以在这里使用xrange()。)
for i in length_of_array:
value = array[i]
last_value = array[-1]
我们正在做的是使用range 间接遍历数组,因为每个数组中的项目总数相同。但是,如果我们仔细观察,value 使用i 作为其索引,从 1 开始,所以value 实际上是数组[1],而last_value 是array[1-1] 或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.
这允许函数根据需要多次调用自身,将数字从后拉到前。同样,每次调用它时,它都会关注第一个错误的实例,将其向左拉,直到将其放在正确的位置。希望有帮助!如果您仍然遇到问题,请告诉我。