这是我的代码 - 用于按升序对列表元素进行排序的冒泡排序算法:
foo = [7, 0, 3, 4, -1]
cnt = 0
for i in foo:
for i in range(len(foo)-1):
if foo[cnt] > foo[cnt + 1]:
temp = foo[cnt]
c[cnt] = c[cnt + 1]
c[cnt + 1] = temp
cnt = cnt + 1
cnt = 0
我一直在修改我的代码,但对于在线判断来说,它的效率仍然太低。一些帮助将不胜感激!
最佳答案
Early Exit BubbleSort
- 第一个循环与内部发生的情况无关
- 第二个循环完成了所有繁重的工作。您可以使用
enumerate
来摆脱count
- 要交换元素,请使用 pythonic 交换 -
a, b = b, a
。 - 根据this comment ,利用提前退出的机会。如果内部循环中的任何点都没有进行交换,则意味着列表已排序,并且不需要进一步迭代。这就是
改变
背后的直觉。 - 根据定义,在外循环的第 i 次迭代之后,最后的
i
元素将被排序,因此您可以进一步减少与算法。
foo = [7, 0, 3, 4, -1]
for i in range(len(foo)):
changed = False
for j, x in enumerate(foo[:-i-1]):
if x > foo[j + 1]:
foo[j], foo[j + 1] = foo[j + 1], foo[j]
changed = True
if not changed:
break
print(foo)
[-1, 0, 3, 4, 7]
请注意,这些优化都不会改变 BubbleSort 的渐近 (Big-O) 复杂度(仍然是 O(N ** 2)
),相反,只会减少相关的常数因子。
关于Python:如何使冒泡排序的实现更加省时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47987412/