【问题标题】:Homework on bubble sorting efficiently高效气泡排序作业
【发布时间】:2017-02-17 01:58:00
【问题描述】:

我正在尝试以一种有效的方式进行冒泡排序。我有一个计数,它将我对函数bubble 所做的所有调用加起来。我需要找到一种方法来提高效率,如果调用 bubble 函数并且列表中没有值被交换,那么我不应该再次调用气泡函数。

我这里有三个函数的代码

def bubble_sort(values):
    count = 0
    for i in range(len(values)-1):
        count += 1
        bubble(values)
    return count

def bubble(values):
    while True:
        swapped = False
        for i in range(len(values) - 1):
            if values[i] > values[i + 1]:
                swap(values, i, i+1)
                swapped = True
        if not swapped:
            break

def swap(values, i, j):
    values[i], values[j] = values[j], values[i]

test_1 = [1, 3, 67, 58, 91, 36, 100, 28, 90, 10, 57, 51, 52, 64, 56]
x = bubble_sort(test_1)
print(x, test_1)

test_2 = [2, 3, 4, 1, 5, 6, 7]
y = bubble_sort(test_2)
print(y, test_2)

当我尝试运行以下代码时,我得到的输出是:

14 [1, 3, 10, 28, 36, 51, 52, 56, 57, 58, 64, 67, 90, 91, 100]

预期的输出是:

8 [1, 3, 10, 28, 36, 51, 52, 56, 57, 58, 64, 67, 90, 91, 100]

我认为编辑我的冒泡代码可以解决问题,但即使我要使用普通的冒泡排序功能,它也不会改变任何东西。

感谢任何帮助。谢谢。

【问题讨论】:

标签: python sorting bubble-sort


【解决方案1】:

您需要打破bubble_sort 中调用bubble 的外部循环,以防没有交换。只需从 bubble 中删除 while 并返回一个布尔值,指示是否进行了交换。然后你可以在bubble_sort 中停止for 循环,如果你得到False 作为返回值:

def bubble_sort(values):
    count = 0
    for i in range(len(values)-1):
        count += 1
        if not bubble(values):
            break
    return count

def bubble(values):
    swapped = False
    for i in range(len(values) - 1):
        if values[i] > values[i + 1]:
            swap(values, i, i+1)
            swapped = True

    return swapped 

通过这些修改,您将获得预期的输出:

(8, [1, 3, 10, 28, 36, 51, 52, 56, 57, 58, 64, 67, 90, 91, 100])
(4, [1, 2, 3, 4, 5, 6, 7])

【讨论】:

    【解决方案2】:

    高效的冒泡排序。哈。

    一个简单的解决方法是让您的 bubble 函数在不执行任何交换的情况下返回 False

    def bubble(values):
        has_changed = False
        while True:
            swapped = False
            for i in range(len(values) - 1):
                if values[i] > values[i + 1]:
                    swap(values, i, i+1)
                    has_changed = True
                    swapped = True
            if not swapped:
                break
        return has_changed
    

    然后,在您的 bubble_sort 函数中:

    def bubble_sort(values):
        count = 0
        for i in range(len(values)-1):
            count += 1
            has_changed = bubble(values)
            if has_changed == False:
                break
        return count
    

    【讨论】:

    • 我知道冒泡排序是 O(n^2)。这不是很有效,所以说高效可能有点牵强。感谢您的帮助。
    猜你喜欢
    • 2010-10-28
    • 2016-08-12
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多