【问题标题】:Number of swaps and comparisons in Shaker/Cocktail sort -JavaShaker/Cocktail 排序中的交换和比较次数 -Java
【发布时间】: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


【解决方案1】:

让我们举个例子,了解一下计数的变化:

数组[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。


现在让我们采用不同的数组:

数组[5] = { 5 , 4 , 3 , 2 , 1 }

同样,迭代次数将远远超过 4 次迭代。!


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

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

【讨论】:

  • 非常感谢。这帮了大忙! :DD
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多