冒泡排序的最佳案例

Posted

技术标签:

【中文标题】冒泡排序的最佳案例【英文标题】:Best Case for Bubble Sort 【发布时间】:2010-11-24 09:49:21 【问题描述】:

我想知道冒泡排序的最佳情况是什么?例如,可能存在这样的情况,其中对于最后 2 次通过可能没有交换。我正在用 C 语言编写程序。 假设我有一个包含 5 个元素的数组,并且我将元素指定为 1 2 5 4 3,那么最后 2 次传递不会有任何变化?

【问题讨论】:

最好的情况是列表已经排序,但我认为这不是你要问的。你能说得更具体点吗? 我也看不出这和 C# 有什么关系 【参考方案1】:

有多种编写冒泡排序算法的方法,随着时间的推移,该算法似乎变得更好,更高效。我学到的第一个冒泡排序算法如下。最佳和最坏情况下的算法是O(n^2)。

BUBBLESORT(A)
1 for i = 1 to A.length - 1
2     for j = A.length downto i + 1
3         if A[j] < A[j - 1]
4             exchange A[j] with A[j - 1]

***使用的算法(如下)似乎是一种改进,它使用一个标志来判断元素是否已交换,这使得冒泡排序算法的最佳情况是 O(n) 而不是 O(n^ 2)

    procedure bubbleSort( A : list of sortable items )
    n = length(A)
    repeat 
        swapped = false
        for i = 1 to n-1 inclusive do
            /* if this pair is out of order */
            if A[i-1] > A[i] then
                /* swap them and remember something changed */
                swap( A[i-1], A[i] )
                swapped = true
            end if
        end for
    until not swapped
end procedure

这是一个视频,有助于解释 C 编程语言中的第一个算法: https://youtu.be/qOpNrqqTsk4

【讨论】:

如果,比如在某些程序中,早期的冒泡排序需要完成所有迭代。这个 swapped = false 有助于我们的程序随时停止,从而减少了许多步骤。很好的回答。【参考方案2】:

***或我错了,但对我来说最好的情况和最坏的情况都是 O(n2) 这是 摘自《算法简介》一书

BUBBLESORT(A)
1 for i = 1 to A.length - 1
2     for j = A.length downto i + 1
3         if A[j] < A[j - 1]
4             exchange A[j] with A[j - 1]

所以无论数组是否排序,都没有一次通过 因为即使第 4 行被跳过,第 2 行和第 3 行也会按比例执行 到n2次

编辑: 我想我明白了***毕竟是对的,但必须修改 算法通过添加让我们说布尔变量 is_exchange 在进入第二个循环之前将其设置为 false,如果在退出循环后再次为 false,那么我们就完成了,在这种情况下,时间将是 O(n),因为第二个循环被执行了 n 次

【讨论】:

【参考方案3】:

最佳情况:最好的情况是列表已经排序。 a) 会有比较,但没有交换,执行时间在 O(n2) b) 但是如果我们在每次传递中跟踪交换并终止程序检查是否没有交换。那么该程序将只需要一次通过并且最多。单次通过需要 (n-1) 次比较,我们可以说复杂度是 O(n) 的数量级。

【讨论】:

【参考方案4】:

请看Bubble sort:

冒泡排序有最坏情况和平均情况 复杂度都 О(n²),其中 n 是 正在排序的项目数。那里 存在许多排序算法 明显更好的最坏情况或 O(n log n) 的平均复杂度。甚至 其他 О(n²) 排序算法,例如 作为插入排序,往往有更好的 性能优于冒泡排序。 因此冒泡排序不是 n 为时的实用排序算法 大。

最坏情况下的性能 O(n²) 最佳案例性能 O(n) 平均案例表现 O(n²) 最坏情况空间复杂度 O(n) 总,O(1) 辅助 最佳

【讨论】:

【参考方案5】:

冒泡排序很少是进行排序的最佳案例。它异常缓慢且效率低下。许多其他排序算法更快。例如,您可以考虑使用 QuickSort 之类的东西。

我所知道的最快的排序算法是由 Steffan Nilsson 开发的,并在下面的文章中进行了描述。

http://www.ddj.com/architect/184404062;jsessionid=VWL2QD1NWIEIJQE1GHOSKHWATMY32JVN?_requestid=396640

如果你只是想知道如何实现冒泡排序,可以在这里找到一篇好文章。

http://en.wikipedia.org/wiki/Bubble_sort

【讨论】:

您可能要注意,最快的排序通常是特定于应用程序的,尽管几乎所有应用程序都对这种好处不敏感,除了在编写良好的通用目的(库)之外进行优化的代价算法。【参考方案6】:

最好的情况是数据已经排序。另一个很好的例子是当需要排序的项目数量很少时——我曾经使用过它,当我的典型列表是两个项目时,偶尔会排到四个。

【讨论】:

【参考方案7】:

冒泡排序不可能不交换两次。

没有交换的通过意味着列表已经排序。

【讨论】:

【参考方案8】:

很难说是不是你的意思

    冒泡排序的最佳情况算法复杂度是多少,在这种情况下 C# 没有区别,答案是 O(n) 对于已排序的输入。 如果有的话,您应该考虑使用冒泡排序。

在后一种情况下,您不需要这样做,因为对于小情况,Shell sort 和 Insertion sort 的性能都会优于它。我见过的一些表现最好的排序例程是混合快速排序,它对数组的“小”部分使用 Shell 排序。

【讨论】:

【参考方案9】:

最好的情况是一次通过。该列表已经排序。 没有交换 = 完成。

【讨论】:

@Jon 如果不指定算法,您如何判断最佳案例复杂度。我可以看到很多冒泡排序实现 @user567879 无论采用何种冒泡排序实现,至少需要一次完整的通过才能确保列表已排序。最好的情况是列表已排序,并且需要一次通过来验证这一点。 en.wikipedia.org/wiki/Bubble_sort @Jon 如果使用这样的冒泡排序(第一种算法)algorithmist.com/index.php/Bubble_sort。最好的情况复杂度是 O(n^2) ? @user567879 n^2 将是您最糟糕的情况。想想当冒泡排序运行时会发生什么。如果您的列表已经排序,它将为每个项目在您的列表中运行一次。 BEST CASE 是 n(集合中的项目数),因为冒泡排序需要检查每个项目一次。

以上是关于冒泡排序的最佳案例的主要内容,如果未能解决你的问题,请参考以下文章

插入排序比冒泡排序好?

八大数据排序法冒泡排序法的图形理解和案例实现 | C++

冒泡排序为什么最佳负责度为O(n)

python第十四课--排序及自定义函数之案例二:冒泡排序

冒泡排序-测试案例

冒泡排序可视化