我有一个冒泡排序版本:
int i, j;
for i from n downto 1
{
for j from 1 to i-1
{
if (A[j] > A[j+1])
swap(A[j], A[j+1])
}
}
我想使用上述版本的冒泡排序来计算预期的掉期数量。我使用的方法如下所示:
// 0 based index
float ans = 0.0;
for ( int i = 0; i < n-1; i++ )
{
for ( int j = i+1; j < n; j++ ) {
ans += getprob( a[i], a[j]); // computes probability that a[i]>a[j].
}
}
我是以正确的方式还是我错过了什么?
答案 0 :(得分:5)
获得答案的最佳方法是运行冒泡排序算法本身并在swap()调用后包含一个计数器。你的计算函数将(a)几乎与sort本身一样长(取决于swap()与getprob()的运行时间)和(b)在排序时忽略元素顺序改变的点。
顺便说一下,swap()调用的确切数量取决于你需要排序的数据 - 你有n *(n-1)/ 2个比较,其中任何一个都可能导致交换(平均一半,你需要交换比较元素的时间。)
答案 1 :(得分:2)
也许这有帮助。基本上,这提供了一个框架,用于在一组模拟数据集上运行气泡排序并计算交换概率。
设这个概率= p 然后,要查找预期的交换操作数,您需要在真实数据集上应用此操作。设n为该数据集的大小。 然后预期的数字= swapProbability * n * n
n * n之所以出现是因为冒泡排序具有n * n个预期操作。
float computeSwapProbability()
{
int aNumSwaps = 0
int aTotalNumberOfOperations = 0
For all simulation datasets
{
int i, j;
for i from n downto 1
{
for j from 1 to i-1
{
aTotalNumberOfOperations++
if (A[j] > A[j+1])
{
swap(A[j], A[j+1])
aNumSwaps++
}
}
}
}
return (float)aNumSwaps/aTotalNumberOfOperations;
}
答案 2 :(得分:0)
计算交换的最佳方法是在交换的if条件中包含计数器变量。
int swapCount=0;
for (i = 0; i < (length-1); ++i) {
for (j = 0; j < (length-i-1); ++j) {
if(array[j] > array[j+1]) {
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
swapCount++;
}
}
}
printf("Swap count : %d" ,swapCount);