java - Shaker/Cocktail sort 中的交换和比较次数 -Java

标签 java sorting comparison swap bubble-sort

我研究了如何计算冒泡排序的交换和比较,并将振动排序程序修改为:

 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。

为什么会这样,我该如何解决它?

(注意:每次程序运行时数组都是随机的)

另外,交换数量还可以吗?

最佳答案

让我们举个例子来了解计数的变化:

array[5] = { 2 , 1 , 3 , 4 , 5 }

需要多少次迭代?

首先,摇床排序会在每次迭代中从头开始检查,然后从最后开始检查。 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 次迭代。!

<小时/>

因此,对于相同大小的数组和不同的值,迭代次数会不同。!

注意:交换计数和迭代计数在程序中完美使用:)

关于java - Shaker/Cocktail sort 中的交换和比较次数 -Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47615976/

相关文章:

javascript - 如何在忽略字符排列的情况下比较JavaScript中的两个字符串

java - ImageView 拖放

sorting - 在 golang 中对 slice 进行排序

C程序,字符串到int数组命令行排序

java - 寻找可排序对的数据结构的建议

javascript - 有什么方法可以区分js中的数组键类型吗? arr[1] !== 比 arr ["1"]

python - OrderedDict 键错误

java - 与Cloudera Hbase 1.0.0集成时的依赖冲突

java - 在 MVC WAR 和 Batch Jar 之间共享 Spring 应用程序上下文

java - 如何从 java 中的文本文件创建字符串数组列表?