排序功能。说明

时间:2013-11-15 02:10:20

标签: python sorting python-2.7 python-3.x

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

我知道这个功能一般来说是做什么的。它是一种排序算法....但我不知道每个部分/部分的作用。

2 个答案:

答案 0 :(得分:3)

好吧,我必须说最好的方式来理解这一点,就是试验它,了解它的用途,并且基本上学习Python。 :)

但是,我将逐一介绍这些内容以提供帮助:

  1. 定义一个名为my_sort的{​​{3}},它接受​​一个名为array的参数。其余行包含在此函数中。

  2. 使用function创建一系列数字,其范围从1开始,到array非包含的长度。然后,将此范围分配给变量length_of_array

  3. 启动range,迭代上一行中定义的范围。此外,将返回的每个数字分配给变量i。这个for循环包含第4到第9行。

  4. 创建一个变量value,该变量等于位置array的{​​{3}} i返回的项目。

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

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

  7. 使i的{​​{1}}索引等于array

  8. 使last_value的{​​{1}}索引等于i-1

  9. 重新运行array for-loop,传递参数value

  10. 为递归函数的这次迭代返回my_sort

  11. 当最终对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]

这允许函数多次调用自身,从而将数字从后面拉到前面。同样,每次调用它时,它都会关注第一个错误的实例,向左拉一个直到它将其置于正确的位置。希望有所帮助!如果你还有问题,请告诉我。