为何添加标志位的冒泡排序并没有提高实际效率?

发布于 2022-09-05 22:00:04 字数 1358 浏览 13 评论 0

刚开始学习Python,就想用它简单实现一下以前学习过的数据结构与算法,一上来就遇到了冒泡排序的问题,因为冒泡排序常见的有两种,普通的以及使用标志位减少比较次数的,下面是我用Python3对它们的实现:

@time_usage
def bubdle_sort1(lists):
    """冒泡排序"""
    if list_check(lists) is False:
        return lists

    for i in range(len(lists) - 1):
        for j in range(len(lists) - i - 1):
            if lists[j] > lists[j + 1]:
                lists[j], lists[j + 1] = lists[j + 1], lists[j]
    return lists


@time_usage
def bubdle_sort2(lists):
    """冒泡排序添加标志位版本"""

    if list_check(lists) is False:
        return lists

    for i in range(len(lists) - 1):
        flag = True
        for j in range(len(lists) - i - 1):
            if lists[j] > lists[j + 1]:
                lists[j], lists[j + 1] = lists[j + 1], lists[j]
                flag = False
        if flag:
            return lists
    return lists

其中time_usage是用来计算函数执行时间的装饰器,list_check是参数检查用的,理论上第二种冒泡排序的效率会高一些,但是实际执行时却并非如此,下面是在0~20000中取10000个随机整数的排序时间:

图片描述

多次比较之后,第二种总是比第一种慢一点点。为了参照,我又用c++实现后作为对比,结果依然如此,这是30000个随机整数的排序时间:

图片描述

多次排序后的结果依然如此,和预期结果并不相符,请问问题出在哪里呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

知足的幸福 2022-09-12 22:00:04

你那个flag,只有当大部分数都排好序的时候才用得上。随机取10000个数的话不太可能遇到这种情况。相反每次循环都要花时间判断flag,所以总体是得不偿失。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文