Java插入排序:计算数据比较

时间:2014-05-05 17:59:19

标签: java sorting

我正在尝试使用Java放置一个计数器,用于数据比较和此插入排序算法的数据交换次数。虽然我认为计数器swapsNo正确放置,但compsNo没有给我预期的输出(两者都初始化为零)。在将compElem与列表项进行比较的情况下,我最初将它放在目前要计数的位置,但显然这只是对列表中每个项目的计数器进行计数。我想知道计数器是否应该在算法中或在其他地方完全出现两次。

public void insertionSort(T[] list, int length)
{
 for (int firstOutOfOrder = 1; firstOutOfOrder < length;
                               firstOutOfOrder ++)
 {
     Comparable<T> compElem =
               (Comparable<T>) list[firstOutOfOrder];
     compsNo++;

     if (compElem.compareTo(list[firstOutOfOrder - 1]) < 0)
     {
         Comparable<T> temp =
                     (Comparable<T>) list[firstOutOfOrder];
         //or perhaps compsNo++; should go here??
         int location = firstOutOfOrder;

         do
         {
             list[location] = list[location - 1];
             location--;
             swapsNo++;

         }
         while (location > 0 &&
                temp.compareTo(list[location - 1]) < 0);

         list[location] = (T) temp;

     }
   }
 }

更新:我在while循环中添加了compsNo ++的增量(以前是doWhile),并在if语句中为swapsNo ++增加了增量。这接近预期的输出,但我对我的编辑还不太自信。

public void insertionSort(T[] list, int length)
{
 for (int firstOutOfOrder = 1; firstOutOfOrder < length;
                               firstOutOfOrder ++)

 {
     Comparable<T> compElem =
               (Comparable<T>) list[firstOutOfOrder];
     compsNo++;
     if (compElem.compareTo(list[firstOutOfOrder - 1]) < 0)
     {
         Comparable<T> temp =
                     (Comparable<T>) list[firstOutOfOrder];

         int location = firstOutOfOrder;



         while (location > 0 && temp.compareTo(list[location - 1]) < 0)
         {
             compsNo++;

             list[location] = list[location - 1];
             location--;
             swapsNo++;
         }




         list[location] = (T) temp;
         swapsNo++;
     }
  }
}

1 个答案:

答案 0 :(得分:2)

如果您想计算比较数,则应在包含调用compsNo的每一行之前或之前增加compareTo

在您的代码中,您有两次compareTo次调用,只有一次compsNo++