【问题标题】:Sorting Function. Explanantion排序功能。解释
【发布时间】:2013-11-15 02:10:20
【问题描述】:
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

我知道该函数的一般作用。它是一个排序算法......但我不知道每个单独的部分/部分是如何做的。

【问题讨论】:

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


【解决方案1】:

嗯,我不得不说,理解这一点的最好的方法是试验它,了解它的用途,并且基本上,学习 Python。 :)

不过,我会一一介绍以提供帮助:

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

  2. 使用range 创建一个范围从1array 不包括的长度。然后,将此范围分配给变量length_of_array

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

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

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

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

  7. 使arrayi 索引等于last_value

  8. 使arrayi-1 索引等于value

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

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

array 最终排序后,递归将结束,您将留下array 一切都很好并排序。

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

【讨论】:

    【解决方案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
    

    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_valuearray[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.
    

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

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      相关资源
      最近更新 更多