什么是泡沫排序适合?

时间:2008-11-09 16:55:00

标签: algorithm language-agnostic sorting bubble-sort

泡泡种类有任何现实世界的用途吗?每当我看到一个提到的,它总是要么:

  1. 要学习的排序算法。
  2. 要使用 的排序算法的示例。

16 个答案:

答案 0 :(得分:72)

冒泡排序(可证明)是非常特定情况下可用的最快排序。它最初是众所周知的,主要是因为它是第一个被严格分析的算法(任何类型)之一,并且证明它在有限的环境下是最优的。

考虑存储在磁带驱动器上的文件,以及在任何给定时间只能将两个记录加载到内存中的随机存取存储器(或大型密钥)。重绕磁带的速度很慢,以至于在文件中进行随机访问通常是不切实际的 - 如果可能,您希望按顺序处理记录,一次不超过两个。

当磁带驱动器很常见时,只有几千(字|字节)RAM(无论什么类型)的机器很常见,这是值得研究的现实。这种情况现在很少见,因此研究泡沫排序根本没什么意义 - 但更糟糕的是,无论如何都没有教授最佳情况,所以即使在正确的情况出现时,几乎没有人能够实现< / em>它。

就极小和/或几乎排序的数据集而言,它是最快的,虽然这可以掩盖冒泡排序的弱点(至少在某种程度上),但插入排序基本上总是更好/两者都是。

答案 1 :(得分:41)

这取决于您的数据分发方式 - 如果您可以做出一些假设。

我发现了一个最好的链接,了解何时使用冒泡排序 - 或其他类型,这是一个关于排序算法的动画视图:

http://www.sorting-algorithms.com/

答案 2 :(得分:19)

它在现实世界中没有得到太多使用。它是一个很好的学习工具,因为它易于理解并且快速实现。它具有不良(O(n ^ 2))最坏情况和平均性能。当您知道数据几乎已经排序时,它具有良好的最佳案例性能,但是有许多其他算法具有此属性,具有更好的最差和平均案例性能。

答案 3 :(得分:10)

我最近在一个优化轶事中发现了它的一个很好的用途。一个程序需要一组精灵按每个帧的深度顺序排序。 spites顺序在帧之间不会有太大变化,因此作为优化,它们通过每帧一次通过进行冒泡排序。这是在两个方向(从上到下和从下到上)完成的。所以精灵总是几乎用非常有效的O(N)算法进行排序。

答案 4 :(得分:7)

对于微小集合来说,它可能是最快的。

说到教育。链接到sorting out sorting的最后一个场景,真是太神奇了。必看。

答案 5 :(得分:3)

这对小型数据集很有用 - 这就是为什么一些qsort实现在分区大小变小时切换到它的原因。但插入排序仍然更快,所以没有充分的理由使用它除了作为教学辅助。

答案 6 :(得分:3)

我们最近在算法的最优性证明中使用了bubblesort。我们必须将由一系列对象表示的任意最优解转换为我们的算法找到的解决方案。因为我们的算法只是“按此标准排序”,我们必须证明我们可以对最佳解决方案进行排序而不会使其变得更糟。在这种情况下,冒泡排序是一个非常好的算法,因为它具有良好的不变性,只需交换两个彼此相邻且排序错误的元素。我认为,使用更复杂的算法会使大脑融化。

问候。

答案 7 :(得分:2)

我认为这是一个很好的“教学”算法,因为它很容易理解和实现。出于同样的原因,它对于小数据集也可能有用(尽管一些O(n lg n)算法也很容易实现)。

答案 8 :(得分:2)

我无法抗拒回应有关冒泡的任何评论,提及更快(似乎是O(nlogn),但这并没有真正证明)Comb Sort。请注意,如果使用预先计算的表,Comb排序会更快一些。梳子排序与冒泡排序完全相同,只是它最初不是通过交换相邻元素开始的。它实现/理解与冒泡排序一样容易。

答案 9 :(得分:2)

Bubble sort易于实现,当您拥有较小的数据集时,它足够快。

当你的集合几乎被排序时(例如,一个或多个元素不在正确的位置),冒泡排序足够快,在这种情况下,你最好交织遍历从0索引到n索引和从n索引到0索引。 使用C ++可以通过以下方式实现:

void bubbleSort(vector<int>& v) { // sort in ascending order
  bool go = true;
  while (go) {
    go = false;
    for (int i = 0; i+1 < v.size(); ++i)
      if (v[i] > v[i+1]) {
         swap(v[i], v[j]);
         go = true;
      }
    for (int i = (int)v.size()-1; i > 0; --i) 
      if (v[i-1] > v[i]) {
         swap(v[i-1], v[i]);
         go = true;
      }
  }
}

如果两个相邻项目的交换是芯片并且任意项目的交换是昂贵的,那就好了。

Donald Knuth, in his famous "The Art of Computer Programming", concluded that "the bubble sort seems to have nothing to recommend it, except a catchy name and the fact that it leads to some interesting theoretical problems"

由于该算法易于实现,因此易于支持,在实际应用程序生命周期中减少支持工作量非常重要。

答案 10 :(得分:1)

这是我经常使用的那种。 (在我们的项目中,我们不能使用任何外部库。)

当我确定数据集非常小时,这很有用,所以我不关心速度,想要最简单和最简单的代码。

泡泡不是你能去的最低点。最近,我遇到了需要排序三个元素的情况。我写了这样的话:

// Use sort of stooge to sort the three elements by cpFirst

SwapElementsIfNeeded(&elementTop, &elementBottom);
SwapElementsIfNeeded(&elementTop, &elementMiddle);
SwapElementsIfNeeded(&elementMiddle, &elementBottom);

*pelement1 = elementTop;
*pelement2 = elementMiddle;
*pelement3 = elementBottom;

答案 11 :(得分:1)

我曾经在某些情况下使用TRS-80 Model 1上的小N. 使用for循环,可以在一个程序行上实现完整的排序。

除此之外,它有利于教学,有时也适用于几乎按顺序排列的列表。

答案 12 :(得分:1)

我曾经将它用于绝大部分时间排序两件物品的情况。

下次我看到那段代码时,有人用库排序替换了它。我希望他们首先对它进行基准测试!

答案 13 :(得分:1)

编码快速简便,(几乎不可能做错)。如果您没有进行繁重的工作并且没有图书馆分类支持,它就有它的位置。

答案 14 :(得分:0)

哦,是的,这是一个很好的选择机制。如果你在某人写的代码中找到它,你就不会雇用他。

答案 15 :(得分:0)

主要是没有。请改用QuickSort或SelectionSort ......!