如何评估嵌套的布尔值?

时间:2019-02-28 15:41:31

标签: python for-loop boolean

我是python的新手,对基本知识已经很熟悉,甚至嵌套了for循环。我遇到了下面的函数,当我试图了解它在做什么时,我被绊倒了。它总是返回通过该函数传递的列表,并且似乎根据传入的列表的长度为元素“ x”分配布尔值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

1 个答案:

答案 0 :(得分:1)

您编写的函数是一种称为冒泡排序的排序技术的实现。它只是比较相邻元素以对列表进行排序。

尽管您不必在size - x - 1迭代中停止第二个for循环,但这有助于减少您执行的比较次数,从而提高了算法的效率,该算法的时间复杂度约为n ^ 2在较大的列表上表现较差。

如果您跟踪执行过程,您将认识到,在外循环的每次迭代之后,又有一个元素到达排序数组中的确切位置,最好不要在后续迭代中考虑该元素。

因此,您的程序会知道最后x个元素已经排序,因此可以尽早停止内部循环。

当涉及布尔值时,它会进一步减少您执行的比较。 例如,当您传递排序列表时: 在外循环的第一次迭代中,x = 0。然后,内部循环迭代size - 1次,以比较相邻元素,但由于元素已经按顺序进行,所以不执行交换。 一旦内部循环完成了外部循环(x = 0)的第一次迭代的所有迭代,则继续进行迭代就毫无意义了,此时最好停止算法。 break语句可确保这种情况发生。

因此,在最佳情况下,算法的时间复杂度应为n(O(n))的数量级,这要比O(n^2)的平均或最坏情况的复杂度要好。