Python:如何使冒泡排序的实现更加省时?

标签 python performance sorting bubble-sort

这是我的代码 - 用于按升序对列表元素进行排序的冒泡排序算法:

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

  1. 第一个循环与内部发生的情况无关
  2. 第二个循环完成了所有繁重的工作。您可以使用enumerate来摆脱count
  3. 要交换元素,请使用 pythonic 交换 - a, b = b, a
  4. 根据this comment ,利用提前退出的机会。如果内部循环中的任何点都没有进行交换,则意味着列表已排序,并且不需要进一步迭代。这就是改变背后的直觉。
  5. 根据定义,在外循环的第 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/

相关文章:

python - 如果条件为真,则使用 python 代码发送邮件

python - 字符串如何在python中转换为int?

python - 神经机器翻译模型预测偏差一

python turtle 奇怪的光标跳转

performance - 具有内存限制的系统的哈希表

sql - 棘手的 MS Access SQL 查询以删除多余的重复记录

Python lxml - 按子级排序

java - 如何在 Java 中对对象数组进行排序

algorithm - 检查大小为 N 的 ArrayList 中是否有两个数字的总和为 N

MySQL 查询性能困境 : enum vs tables