我已经研究了如何计算冒泡和比较泡泡排序并修改了一个振动筛排序程序:
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。
为什么会这样做,我该如何解决?
(注意:每次运行程序时,数组都是随机的)
此外,交换计数还可以吗?
答案 0 :(得分:1)
让我们举例并理解计数的变化:
array [5] = {2,1,3,4,5}
需要多少次迭代。?
首先,在每次迭代中,shaker sort将从开始检查然后从最后检查。 count
在开始时为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
。
现在让我们采取不同的数组:
array [5] = {5,4,3,2,1}
同样,迭代将更多地进行4次迭代。!
因此,对于相同大小的数组和不同的值,迭代次数将不同。!
注意:交换计数和迭代计数在程序中使用完美:)