Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shaker/Cockbox排序中的交换数和比较数-Java_Java_Sorting_Comparison_Swap_Bubble Sort - Fatal编程技术网

Shaker/Cockbox排序中的交换数和比较数-Java

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

我研究了如何计算气泡排序的交换和比较,并将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==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