我知道反序列表应该产生theta(n ^ 2)个比较数和theta(n ^ 2)个数量的交换用于冒泡排序。在我的示例代码中,我使用的是大小为n = 10的列表。我为numComparisons和numExchanges实现了计数器,尽管这看起来并不复杂,但我无法弄清楚为什么我的结果会消失。 ; t产生100次比较和100次交换。我真的远离目标吗?
void testList::bubbleSort()
{
int k = 10;
bool flag = true;
while(flag)
{
k = k - 1;
flag = false;
for(int j = 0; j < k; j++)
{
if( vecPtr[j] > vecPtr[j+1])
{
int temp = vecPtr[j];
vecPtr[j] = vecPtr[j+1];
vecPtr[j+1] = temp;
numExchanges += 1;
flag = true;
}
numComparisons++;
}
}
}
结果输出:
原始列表:10 9 8 7 6 5 4 3 2 1
排序列表:1 2 3 4 5 6 7 8 9 10
比较:45
交流:45
我也试过这个实现,但我的结果是一样的:
void testList::bubbleSort()
{
int temp;
for(long i = 0; i < 10; i++)
{
for(long j = 0; j < 10-i-1; j++)
{
if (vecPtr[j] > vecPtr[j+1])
{
temp = vecPtr[j];
vecPtr[j] = vecPtr[j+1];
vecPtr[j+1] = temp;
numExchanges++;
}
numComparisons++;
}
}
}
答案 0 :(得分:2)
预计将进行大约N 2 / 2的比较和交换。
特别是,内部循环启动外部循环的当前值。因此,在第一次迭代中,它遍历整个数组。在每次后续迭代中,它遍历数组中的少一个项目。
因此,内环的迭代次数为N + N-1 + N-2 ... 1.平均来说,这大约为N / 2.
如果你想要更精确,还需要考虑另外一个细节:内循环从i + 1 ... N迭代,所以它的最大值是N-1次迭代,而不是N次迭代。 / p>
因此,它不是精确地N 2 / 2,而是N *(N-1)/ 2。在你的情况下,10 * 9/2 = 45。
这是比较次数的计数。对于掉期,您可以获得一定比例,具体取决于无序的商品数量。在您的特定情况下,所有项目始终无序(因为您以反向顺序开始),因此您需要为每次比较进行交换。通过任何其他订购,您可以预期交换数量会减少。
答案 1 :(得分:1)
45 = 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1,所以对于交换这是正确的,但是对于比较我认为某处肯定存在错误。编辑:你实现了比标准冒泡排序更智能的版本,这就是为什么你只有45次比较而不是90次(它不是100次,一次迭代需要9次比较)。