在给定数组上由Bubble-Sort执行的交换次数

时间:2015-08-09 11:20:15

标签: arrays sorting swap bubble-sort

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

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

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

我的第一直觉是使用冒泡排序和每个swap(),我增加了一个Swap变量。但是时间的复杂性是一个非常缓慢的过程,我希望你的帮助找到一种解决我的困境的优化方法

P.S。:我还需要比较它是否更快以升序或降序排序....对它进行两次排序使时间加倍。

修改

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

1 个答案:

答案 0 :(得分:2)

已应用 swap()作为a[i]a[i+1]作为a[i]冒泡。 现在,询问将要发生多少次掉期与询问将要发生多少次泡沫操作相同。好吧,我们有多少人?

每个a[i]的每个j > i都会冒出来,a[j]<a[i]a[i]。在单词a[i]中,每个位置都会向右冒泡,其中该位置的元素值小于a[]本身。满足此条件的一对元素是a[]的{​​{3}}。

重新提出问题我们可以问: a[]中的反转总数是多少? (a.k.a. a[]的倒数是多少?)

这是一个众所周知的问题,除了在O(n ^ 2)中运行的一些明显的方法之外,解决这个问题的典型方法是稍微调整一下合并排序以找到这个数字。由于merge-sort在O(n * log(n))中运行,因此您可以获得相同的运行时间来查找 public MapPage() { this.InitializeComponent(); this.navigationHelper = new NavigationHelper(this); this.navigationHelper.LoadState += navigationHelper_LoadState; this.navigationHelper.SaveState += navigationHelper_SaveState; MapTileLayer layer2 = new MapTileLayer(); layer2.Opacity = 1; string ip = this.getCurrentIPAddress().ToString(); layer2.GetTileUri += (s, e) => { e.Uri = new Uri(string.Format("http://localhost:3000/{0}/{1}/{2}.png", e.LevelOfDetail, e.X, e.Y)); }; MyMap.TileLayers.Add(layer2); shapeLayer = new MapLayer(); MyMap.Children.Add(shapeLayer); poiLayer = new MapLayer(); MyMap.Children.Add(poiLayer); this.all_btn.IsChecked = true; } 的反转数。

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

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

如果你在考虑之后仍然陷入困境,你可以在这里查看一些完整的解决方案: