【问题标题】:Number of swaps performed by Bubble-Sort on a given array冒泡排序对给定数组执行的交换次数
【发布时间】:2015-11-01 10:18:24
【问题描述】:

我得到了一个数组,我被要求找出使用冒泡排序

对数组进行排序所需的交换次数

现在我们知道了,我们可以通过n(n-1)/2 找到比较,但我需要的是actual swaps 的数量

我的第一反应是使用冒泡排序,每次使用 swap(),我都会增加一个 Swap 变量。但是这个时间复杂度是一个非常缓慢的过程,我希望你能帮助我找到一种优化的方法来解决我的困境

P.S.:我还需要比较按升序或降序排序是否更快....将其排序两次会使时间加倍。

编辑:

对不起,如果我不够清楚。我想在不使用冒泡排序的情况下找到交换。

【问题讨论】:

  • 跟着你的第一直觉走。有一个额外的恒定时间操作(增加一个计数),不会改变整个排序方法的渐近运行时间......为什么会是一个“缓慢的过程”?
  • "但是这个时间复杂度是一个很慢的过程" 错了。在这种情况下,再添加一个操作对时间复杂度没有任何影响。此外,它是冒泡排序。如果时间复杂度是一个问题,你永远不会使用冒泡排序。
  • 对不起,我根本不想使用冒泡排序。我想知道是否有任何算法可以在不使用冒泡排序的情况下找到交换

标签: arrays sorting swap bubble-sort


【解决方案1】:

应用swap()a[i]a[i+1] 视为a[i]泡沫。 现在,询问将发生多少次互换与询问将发生多少次冒泡操作是一样的。好吧,我们有多少?

每个a[i] 将针对j > i 的每个位置冒泡,其中a[j]<a[i]。换句话说,a[i] 将在右侧的每个位置冒泡,其中该位置的元素值小于a[i] 本身。满足此条件的一对元素称为inversiona[]

因此,我们可以重新提出您的问题:a[] 中的反转总数是多少? (又名a[] 的反转号是多少?)

这是一个众所周知的问题,除了一些在 O(n^2) 中运行的明显方法之外,解决此问题的典型方法是稍微调整合并排序以找到这个数字。并且由于合并排序在 O(n*log(n)) 中运行,因此您获得相同的运行时间来找到 a[] 的反转数。

既然您知道您可以调整合并排序,我建议您自己尝试一下如何准确地做到这一点。

提示:您必须回答的主要问题是:在两个数组的合并步骤中定位单个元素时,我修复了多少反转?然后简单地把所有这些加起来。

如果您在考虑后仍然卡住,您可以在这里查看一些完整的解决方案:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2016-04-04
    • 2012-07-05
    • 2018-11-11
    • 1970-01-01
    • 2015-04-10
    • 2017-01-09
    • 2012-07-05
    相关资源
    最近更新 更多