【发布时间】:2018-05-16 21:24:45
【问题描述】:
我查看了如何计算冒泡排序的交换和比较,并将振动排序程序修改为:
public void shakerSort(int a[]) // http://www.geeksforgeeks.org/cocktail-sort/
{
boolean swapped = true;
comparisons = 0;
swaps = 0;
int start = 0;
int end = a.length;
while (swapped==true)
{
swapped = false;
for (int i = start; i < end-1; ++i)
{
comparisons++; //count comparisons
if (a[i] > a[i + 1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
swapped = true;
swaps++; //count swaps
}
}
if (swapped==false)
{
break;
}
swapped = false;
end = end-1;
for (int i = end-1; i >=start; i--)
{
comparisons++; //count comparisons
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
swapped = true;
swaps++; //count swaps
}
}
start = start+1;
}
}
但是,对于一个包含 100 个元素的数组,比较次数应始终为 4950 ( n(n-1)/2 ),它为我提供了一个每次运行程序时都会更改的值 - 并且该值始终小于 4950。
为什么会这样,我该如何解决?
(注意:每次程序运行时数组都是随机的)
另外,交换计数可以吗?
【问题讨论】:
-
你是否给出与输入相同的数组?
-
它的大小始终相同,但每次随机化的方式不同。会不会有影响?
-
是的,可能有案例。!看,你给了一个循环,
while(swap)现在,这一定是计数变化的原因。想想如果没有交换变量并且你的swap没有更改为true。因此它是false。所以在这种情况下,程序不会进入循环。这是计数不同的唯一原因。我不确定排序逻辑。但该循环肯定会进行所有更改。 -
嗯,我明白了,但我不知道如何解决它......
-
没有什么可以修复的。一切都是对的。我检查算法。你的代码是完美的。您只需要接受每个输入的迭代次数都会不同。所以计数会有所不同。另外
swap计数也很完美。!
标签: java sorting comparison swap bubble-sort