2015-08-09 107 views
1

上进行互换数他们给了我一个数组,我问找出使用冒泡排序通过冒泡排序定数组

要排序的数组现在我们知道需要互换的数量这一点,我们可以通过n(n-1)/2找到的比较,但我需要的是我的第一直觉是使用冒泡排序的actual swaps

的数量和每个交换(),我递增交换变量。但时间复杂度是一个非常缓慢的过程,我希望你的帮助找到解决我的困境的优化方法

PS:我还需要比较它是以升序还是降序排序更快。 ...排序两倍时间。

编辑:

很抱歉,如果我wan't不够清楚。我想找到不使用Bubble Sort的交换。

+3

去与你的第一直觉。有一个额外的恒定时间操作(增加一个计数),不会改变整个排序方法的渐近运行时间...为什么这将是一个'缓慢的过程'? – dingalapadum

+1

“_但这是一个非常缓慢的过程_”错误。在这种情况下增加一个操作对时间复杂性没有影响。此外,它是泡沫排序。如果时间复杂性是一个问题,你永远不要使用冒泡排序。 – csmckelvey

+0

对不起,我不想使用Bubble Sort。我想知道是否有任何算法可以在不使用Bubble Sort的情况下找到交换 –

回答

2

方面施加swap()a[i]到和a[i+1]作为气泡向上的a[i]。 现在,询问将要发生多少交换与询问将发生多少次冒泡操作相同。那么,我们有多少人呢?

每个a[i]都会为每个位置起泡j > i,其中a[j]<a[i]。换句话说,a[i]将会为每个位置向右鼓起来,其中该位置的元素值本身小于a[i]。满足这种条件的一对元素是a[]inversion

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

这是一个众所周知的问题,除了在Ø上运行一些明显的方法(N^2)典型的办法处理这一问题是调整归并排序位在为了找到这个号码。并且,由于合并排序在O(n * log(n))中运行,因此您可以使用相同的运行时间查找a[]的反转编号。

既然你知道你可以调整合并排序,那么我建议你自己试试看如何准确完成它。

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

如果您仍然一番考虑后卡住了,你可以看看这里一些完全成熟的解决方案: