Java - 为什么我的冒泡排序比我的插入排序更快?

时间:2015-02-06 00:12:14

标签: java sorting

我测量排序完成排序所需的步骤数,无论出于何种原因,冒泡排序似乎总比插入排序快一点,从我读到的,它应该是另一种方式

不会发布我的完整代码,但我相信问题可能在于我的计数。

冒泡排序:

public void sort()
{
    for (out = nElems-1 ; out >= 1 ; out--)
    {
        count = count+1;
        for (in = 0 ; in < out ; in++)
        {
            if ((a.get(in)) > (a.get(in+1)))
            {
                swap (in, in+1);
                count = count+2;
            }
        }
    }
}

插入排序:

void sort()
{
    Integer temp[] = new Integer[1];
    for (out = 1 ; out < nElems ; out++)
    {
        count = count+1;
        temp[0] = a.get(out);
        in = out;
        while (in > 0 && a.get(in-1) >= temp[0])
        {
            a.set(in, a.get(in-1));
            --in;
            count = count+2;
        }
        a.set(in, temp[0]);
    }
}

并举一个例子,我整理了3个填充了2000个随机整数的文本文件,其值为1-2000,插入排序的平均值为2,007,677步,冒泡排序的平均值为2,005,719。

1 个答案:

答案 0 :(得分:1)

因此,首先,您只是测量作业,而不是整体表现。其次,您的插入排序具有不进行交换以优化移动值的优化,那么为什么每次都要向count添加2?你的while循环应该只添加1到count,然后当你有a.set(in,temp[0])时,你应该在while循环之外再添加1。 (旁注 - 为什么temp是一个数组而不只是一个整数?) 现在,如果要测量整体性能,则需要测量比较和分配(最好是在两个单独的变量中,因为某些设备/体系结构对于这些操作可能具有非常不同的性能)。

编辑:

为了澄清,比较是指将数组中两个项的值与小于(&lt;)或大于(&gt;)的运算符进行比较。赋值是指在数组中更改值时(在您的情况下,使用a.set())。

以下是一些代码修改(我将count拆分为两个变量,代表您要衡量的实际内容,assignmentscomparisons):

冒泡排序:

public void sort()
{
    for (out = nElems-1 ; out >= 1 ; out--)
    {
        for (in = 0 ; in < out ; in++)
        {
            comparisons = comparisons+1;
            if ((a.get(in)) > (a.get(in+1)))
            {
                swap (in, in+1);
                assignments = assignments+2;
            }
        }
    }
}

插入排序:

void sort()
{
    int temp = 0;
    for (out = 1 ; out < nElems ; out++)
    {
        count = count+1;
        temp[0] = a.get(out);
        in = out;
        comparisons = comparisons + 1; //You're doing the comparison below at least once
        while (in > 0 && a.get(in-1) >= temp[0])
        {
            a.set(in, a.get(in-1));
            --in;
            assignments = assignments+1;
            comparisons = comparisons + 1; 
        }
        a.set(in, temp[0]);
        assignments = assignments+1;
    }
}

还有一件事要考虑 - 你在哪里初始化变量count?我在你的代码中没有看到它,它实际上可能是你在不同的范围内使用相同的变量,并且因为你没有将它重置为0,所以你要做的第二种是添加到你的第一个号码。