【问题标题】:Python 3: Optimised Bubble SortPython 3:优化冒泡排序
【发布时间】:2016-05-18 01:50:49
【问题描述】:

请帮忙。我需要优化我的冒泡排序算法,以便获得比未优化的冒泡排序更少的总比较。我设法创建了“普通冒泡排序”(仅从左到右移动):

def bubbleSort(values):
    n = len(values) - 1
    swap = True
    ncomp = 0 # My total comparisons counter
    while swap:
        swap = False
        for i in range(n): # i = 0, 1, 2, ..., n-1
            ncomp += 1
            if values[i] > values[i+1]:
                temp = values[i]
                values[i] = values[i+1]
                values[i+1] =  temp
                swap = True
    return values, ncomp

所以基本上我不知道如何创建一个“优化的bubbleSort”,一个bubbleSortPlus 函数,其中气泡在两个方向上传播:从左到右,紧接着是从右到左的传播。理论上,在每次通过时,气泡的行程都应该缩短(将行程中最后一次交换的位置保存在一个变量中,并使下一次行程从该位置开始。我很努力但我只是一条蟒蛇新手,请帮忙。

【问题讨论】:

  • 请参阅How to debug my Bubble Sort code? 那里您会发现随着时间改变内部循环计数的优化。您正在谈论的优化根本无济于事,因为 2 遍将相互影响。更不用说开销了,所以结果要么是错误的(如果没有正确编码)要么比以前慢。

标签: python algorithm python-3.x bubble-sort


【解决方案1】:

这里有一些框架代码,展示了如何向前和向后扫描数组,同时在每次迭代时缩小列表。

values = 100,101,102,103,104,105

start = 0
stop = len(values)-1

while stop > start:
    for i in range(start, stop):
        print i, "compare", values[i], "with", values[i+1]
    print "moved a large value to index", stop
    print

    stop = stop - 1
    if stop == start:
        break

    for i in range(stop, start, -1):
        print i, "compare", values[i], "with", values[i-1]
    print "moved a small value to index", start
    print

    start = start + 1

【讨论】:

  • 很酷,但是如何添加总比较计数器?
  • @Anderson 这只是起点。您需要添加实际进行比较/交换的代码,然后您可以添加比较计数器。
  • 好吧,我会试试的。非常感谢
  • 嗨,@user3386109,感谢您的解决方案。但是只是出于好奇,我怎么知道它是否确实是优化版本?是否有证据或任何直观的解释。因为在我看来,它只是以更高级的顺序进行冒泡排序,而既不会降低时间复杂度,也不会降低比较次数。如果我错了,请纠正我,谢谢:)
  • @LifuHuang 你说得对。 OP 正在试验算法设计。双向冒泡排序就是这样一种实验。学生实现代码后,他们发现它与普通冒泡排序具有相同的复杂性。所以这对学生来说只是一个有趣的练习。
【解决方案2】:

我猜它已经被优化了...... 朴素冒泡排序不包括swap 标志。所以在任何情况下它都不会返回,直到完成所有 O(n^2) 比较。但是使用swap 标志,如果输入序列已“几乎排序”,则比较次数将几乎是线性的。

【讨论】:

猜你喜欢
  • 2013-04-18
  • 2013-03-09
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2017-07-29
  • 2017-03-02
相关资源
最近更新 更多