冒泡排序的最佳案例
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(集合中的项目数),因为冒泡排序需要检查每个项目一次。以上是关于冒泡排序的最佳案例的主要内容,如果未能解决你的问题,请参考以下文章