在冒泡排序中计算交换次数和比较的问题

时间:2015-04-17 00:51:15

标签: c++

我知道反序列表应该产生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++;
        }
    }
}

2 个答案:

答案 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次比较)。