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

我知道该功能通常是做什么的。它是一个排序算法......但我不知道每个单独的部分/部分是如何做的。

4

2 回答 2

3

好吧,我不得不说,理解这一点的最好方法是尝试它,了解它在使用什么,基本上,学习 Python。:)

但是,我将逐条介绍以提供帮助:

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

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

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

  4. 创建一个变量,该变量等于在位置索引value返回的项目。 arrayi

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

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

  7. 使i索引array等于last_value

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

  9. my_sort 递归地重新运行,传入参数array

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

array最终排序时,递归将结束,您将得到array所有好的排序。

我希望这能对这个主题有所启发!

于 2013-11-15T03:05:15.460 回答
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会使用i1 作为它的索引,它从 1 开始,value实际上 array[1] 也是如此,并且last_valuearray[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.

这允许该函数根据需要将一个数字从后面拉到前面来多次调用自己。同样,每次调用它时,它都会关注第一个错误的实例,将其向左拉,直到将其放置在正确的位置。希望有帮助!如果您仍然遇到问题,请告诉我。

于 2013-11-16T12:09:31.377 回答