我测量排序完成排序所需的步骤数,无论出于何种原因,冒泡排序似乎总比插入排序快一点,从我读到的,它应该是另一种方式
不会发布我的完整代码,但我相信问题可能在于我的计数。
冒泡排序:
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。
答案 0 :(得分:1)
因此,首先,您只是测量作业,而不是整体表现。其次,您的插入排序具有不进行交换以优化移动值的优化,那么为什么每次都要向count
添加2?你的while循环应该只添加1到count
,然后当你有a.set(in,temp[0])
时,你应该在while循环之外再添加1。 (旁注 - 为什么temp
是一个数组而不只是一个整数?)
现在,如果要测量整体性能,则需要测量比较和分配(最好是在两个单独的变量中,因为某些设备/体系结构对于这些操作可能具有非常不同的性能)。
编辑:
为了澄清,比较是指将数组中两个项的值与小于(&lt;)或大于(&gt;)的运算符进行比较。赋值是指在数组中更改值时(在您的情况下,使用a.set()
)。
以下是一些代码修改(我将count
拆分为两个变量,代表您要衡量的实际内容,assignments
和comparisons
):
冒泡排序:
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,所以你要做的第二种是添加到你的第一个号码。