2013-11-15 52 views
2
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 

我知道函数的一般功能。它的排序alogarithm ....但我不知道每个单独的部分/部分如何做。分拣功能。解释

+4

似乎它只是一种不同形式的气泡排序。 – vidit

+0

参考文献http://en.wikipedia.org/wiki/Bubble_sort – user2864740

回答

3

嗯,我不得不说要理解这个最好的方法是试验它,学习它使用什么,基本上学习Python。 :)

不过,我会去通过线一个接一个的帮助:

  1. 定义一个名为functionmy_sort接受名为array一个参数。其余的行都包含在这个函数中。

  2. 使用range创建一个范围的数字,该数字范围从1(含)至array(非包含)。然后,将此范围分配给变量length_of_array

  3. 开始一个for-loop,它遍历前一行定义的范围。此外,将每个编号返回给变量i。此for循环包围线4到9

  4. 创建一个变量value等于在i位置由indexingarray返回的项目。

  5. 创建一个变量last_value,该变量等于在位置i-1处索引array返回的项目。

  6. 测试value是否小于last_value。如果是这样,请运行第7行到第9行。

  7. 使i索引array等于last_value

  8. 使i-1索引array等于value

  9. 重新运行my_sortrecursively,传递参数array

  10. 返回array用于递归函数的迭代。

array最终排序,递归将结束,你将留下array所有漂亮和排序。

我希望能够对这个问题有所了解!

+0

我看到很多子弹,但代码更清晰: – user2864740

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的作用,但是如果你不知道,简而言之,你可以用迭代列表的方式迭代它。

for i in length_of_array: 
    value = array[i] 
    last_value = array[-1] 

我们正在做的是使用range间接遍历数组,因为有相同的总在每一个项目的是(你也可以使用xrange()这里)。如果仔细观察,value使用i作为其索引,该索引从1开始,因此value实际上是array [1],并且last_valuearray[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. 

这样,因为它需要从后向前拉数函数调用自身多次。同样,每次调用它时,它都将重点放在第一个错误的实例上,将它左移一次,直到将其放到适当的位置。希望有所帮助!让我知道你是否仍然有麻烦。