我会看看我能为你做些什么。的代码,以供参考:
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
的作用,但是如果你不知道,简而言之,你可以用迭代列表的方式迭代它。
for i in length_of_array:
value = array[i]
last_value = array[-1]
我们正在做的是使用range
间接遍历数组,因为有相同的总在每一个项目的是(你也可以使用xrange()
这里)。如果仔细观察,value
使用i
作为其索引,该索引从1开始,因此value
实际上是array [1],并且last_value
是array[1-1]
或array[0]
。
if value<last_value:
array[i]=last_value
array[i-1]=value
所以现在我们正在比较这些值。假设我们通过了。我们正处于循环的第一次迭代中,所以我们基本上说,如果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.
这样,因为它需要从后向前拉数函数调用自身多次。同样,每次调用它时,它都将重点放在第一个错误的实例上,将它左移一次,直到将其放到适当的位置。希望有所帮助!让我知道你是否仍然有麻烦。
似乎它只是一种不同形式的气泡排序。 – vidit
参考文献http://en.wikipedia.org/wiki/Bubble_sort – user2864740