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