我得到了一个数组,我被要求找出使用冒泡排序
对数组进行排序所需的交换次数现在我们知道,我们可以通过n(n-1)/2
找到比较,但我需要的是actual swaps
的数量
我的第一直觉是使用冒泡排序和每个swap(),我增加了一个Swap变量。但是时间的复杂性是一个非常缓慢的过程,我希望你的帮助找到一种解决我的困境的优化方法
P.S。:我还需要比较它是否更快以升序或降序排序....对它进行两次排序使时间加倍。
修改
很抱歉,如果我不够清楚的话。我想在不使用冒泡排序的情况下找到交换。
答案 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;
}
的反转数。
既然你知道你可以调整合并排序,我建议你自己尝试一下如何做到这一点。
提示:您必须回答的主要问题是:在两个数组的合并步骤中定位单个元素时,我修复了多少次反转?然后简单地加上所有这些。
如果你在考虑之后仍然陷入困境,你可以在这里查看一些完整的解决方案: