Shaker/Cockbox排序中的交换数和比较数-Java
我研究了如何计算气泡排序的交换和比较,并将shaker排序程序修改为:Shaker/Cockbox排序中的交换数和比较数-Java,java,sorting,comparison,swap,bubble-sort,Java,Sorting,Comparison,Swap,Bubble Sort,我研究了如何计算气泡排序的交换和比较,并将shaker排序程序修改为: 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==tru
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;
}
}
public void shakerSort(int a[])//http://www.geeksforgeeks.org/cocktail-sort/
{
布尔交换=真;
比较=0;
互换=0;
int start=0;
int end=a.长度;
while(swapped==true)
{
交换=假;
对于(int i=开始;ia[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=温度;
交换=真;
交换+++;//计算交换
}
}
如果(交换==false)
{
打破
}
交换=假;
end=end-1;
对于(int i=end-1;i>=start;i--)
{
比较+++;//计数比较
如果(a[i]>a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=温度;
交换=真;
交换+++;//计算交换
}
}
开始=开始+1;
}
}
但是,对于一个包含100个元素的数组,其中比较的数量应始终为4950(n(n-1)/2),它会给我一个值,该值在每次运行程序时都会更改,并且该值始终小于4950
它为什么会这样做,我如何修复它
(注意:每次运行程序时都会随机化数组)
另外,交换计数是否正确?让我们举个例子,了解计数的变化: 数组[5]={2,1,3,4,5} 需要多少次迭代 首先,shaker sort将在每次迭代中从开始检查,然后从最后检查<代码>计数在开始时为0
2 , 1 , 3 , 4 , 5 --> count = 1
^ ^
it will swap 2 and 1
swap count++
1 , 2 , 3 , 4 , 5 --> count = 2
^ ^
no swap
程序将再次检查,因为swap=true
1 , 2 , 3 , 4 , 5 --> count = 3
^ ^
no swap
1 , 2 , 3 , 4 , 5 --> count = 4
^ ^
no swap
程序将结束,因为现在swap=false
现在让我们采用不同的阵列: 数组[5]={5,4,3,2,1} 同样的,迭代次数将远远超过4次
因此,对于相同大小的数组和不同的值,迭代次数将不同
注意:交换计数和迭代计数在程序中使用得非常好:)是否将相同的数组作为输入?数组大小始终相同,但每次随机化程度不同。这会影响它吗?是的,可能会有这样的情况。!看,您给出了一个循环,
while(swap)
现在,它一定是导致计数变化的原因。如果没有交换变量,并且您的交换
未更改为真
,请思考。因此它是false
。因此,在这种情况下,程序将不会进入循环。这是不同计数的唯一原因。我不确定排序逻辑。但那个循环肯定会做出所有的改变。嗯,我明白了,但我不确定如何修复它……没有什么需要修复的。一切正常。我检查算法。你的代码是完美的。您只需要接受每个输入的迭代次数都是不同的。所以计数会有所不同。而且swap
count也很完美。!非常感谢你。这帮了大忙!:DD