我对python还比较陌生,已经熟悉了基本知识,甚至嵌套for循环。我遇到了下面的函数,当我试图理解它在做什么时,我被绊倒了。它总是返回通过函数传递的列表,并根据传入的列表的长度将布尔值False赋给元素“x”,最终在False值不是这样的情况下中断循环。我不明白的是for循环中第一个元素相对于第二个for循环(从大小中减去)的作用。如果有人能帮助我更好地了解这个功能在做什么,我将不胜感激。

def myfunc(list):

    size = len(list)

    for x in range(0, size):
        foo = False

        for x2 in range(0, size - x - 1):
            if list[x2] > list[x2 + 1]:
                list[x2], list[x2 + 1] = list[x2 + 1], list[x2]
                foo = True

        if not foo: break

    return list

最佳答案

您编写的函数是一种称为气泡排序的排序技术的实现。它只是比较相邻的元素来对列表进行排序。
虽然您不必在size - x - 1迭代中停止第二个for循环,但这有助于减少所执行的比较的次数,从而提高了算法的效率,该算法已经具有在较大列表上表现不佳的N ^ 2阶的时间复杂度。
如果跟踪整个执行过程,您将意识到在外部循环的每次迭代之后,还有一个元素到达了它在排序数组中的确切位置,因此在后续迭代中最好不要考虑该元素。
因此,您的程序会提前停止内部循环,因为您知道最后的x元素已经排序。
当涉及到布尔值时,它会进一步减少执行的比较。
例如,当您传入排序列表时:
在外循环的第一次迭代中,x = 0。然后,内环迭代size - 1次,比较相邻元素,但不执行交换,因为元素已经按顺序排列。
一旦内部循环完成了外部循环第一次迭代(x = 0)的所有迭代,继续进行进一步迭代就毫无意义,最好在此时停止算法。break语句确保发生这种情况。
因此,在最好的情况下,算法的时间复杂度将是n(O(n))的顺序,它优于O(n^2)的平均或最坏情况复杂度。

10-02 08:29
查看更多