【问题标题】:How to count comparisons in selection and insertion sorts?如何计算选择和插入排序中的比较?
【发布时间】:2014-11-25 12:56:06
【问题描述】:

我正在写两种不同的类型,一种是选择,另一种是插入。以下是我的插入排序方法

public static void  iSort(String[] array)
{
  int i, j, k;
  String temp; 
  for(i = 1; i<array.length; i++)
  {
   k=i;
   for(j = k-1; j>=0 && array[j].compareTo(array[k])>0; j--)
   {
    ccounter++;
     temp = array[j];
     array[j] = array[k];
     array[k] = temp;
     k--;
   }
   }
 }

其中 ccounter 是一个静态类变量。当我使用 1000 个元素的字符串数组对此进行测试时,我得到的值为 239507。但是,当我使用正确排序的字符串数组进行测试时,我得到的值为零,我知道这是不正确的,因为最佳情况下的性能是n 项的 n 次比较。不知是我的方法写错了,还是计数器放错了

【问题讨论】:

  • 您计算的是交换,而不是比较。 (即你没有计算导致&lt;=0的比较)
  • 在内部for循环中,将比较移动到for循环内部。目前,您仅在需要交换时才计数。如果比较是在循环内完成的,您将计算所有的比较。
  • @arunmoezhi 你的意思是从循环括号中取出条件并将它们放在循环的实际主体中吗?
  • 是的。计数器递增后将其放在循环体内。
  • @njzk2 是的,我刚刚意识到这一点,感谢您引起我的注意。你说的很有道理,不敢相信我错过了。

标签: java insertion-sort selection-sort


【解决方案1】:

问题在于,如果您因为 compareTo() 已返回 false 而退出循环,则您没有计算最后的比较。

如果我正在编写此代码,我会将比较代码封装在一个调用compareTo() 并递增计数器的函数中。然后我会专门使用这个包装函数来做所有的比较。这样就不会出现错误计数的情况。

【讨论】:

    【解决方案2】:

    每次执行内部循环递增计数器,并在递增计数器后进行比较

    public static void  iSort(String[] array)
    {
      int i, j, k,ccounter=0;
      String temp; 
      for(i = 1; i<array.length; i++)
      {
            k=i;
            for(j = k-1; j>=0; j--)
            {
                     ccounter++; //increment counter for every execution of inner loop
                     //better to do integer comparison than string comparison
                     if(Integer.parseInt(array[j]) <= Integer.parseInt(array[k]))
                     {
                         break;
                     }
                     temp = array[j];
                     array[j] = array[k];
                     array[k] = temp;
                     k--;
            }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2019-05-10
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多