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
Java插入排序:计算数据比较_Java_Sorting - Fatal编程技术网

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

Java插入排序:计算数据比较,java,sorting,Java,Sorting,我试图使用Java为这种插入排序算法的数据比较数量和数据交换数量放置一个计数器。虽然我相信计数器swapsNo的位置正确,但compsNo并没有给我预期的输出(都初始化为零)。我最初将它放在当前要计数的位置,以便将compElem与列表项进行比较,但显然这只是增加了列表中每个项的计数器。我想知道计数器是否应该在算法中出现两次,或者完全出现在其他地方 public void insertionSort(T[] list, int length) { for (int firstOutOfOrde

我试图使用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;

     }
   }
 }
public void insertionSort(T[]列表,int-length)
{
for(int firstOutOfOrder=1;firstOutOfOrder0&&
温度比较(列表[位置-1])<0;
列表[位置]=(T)温度;
}
}
}
更新:我在while循环(以前是doWhile)中为compsNo++添加了增量,在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++;
     }
  }
}
public void insertionSort(T[]列表,int-length)
{
for(int firstOutOfOrder=1;firstOutOfOrder0&&temp.compareTo(列表[位置-1])<0)
{
compsNo++;
列表[位置]=列表[位置-1];
地点--;
swapsNo++;
}
列表[位置]=(T)温度;
swapsNo++;
}
}
}

如果要计算比较,应在包含对
compareTo
调用的每一行之后或之前增加
compsNo


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

我的建议是创建一个计数
比较器,并在该类中保持计数。@ElliotFrisch我最初尝试了一些与此线程中的想法一致的东西:,但是作为Java的初学者,我不知道如何使它适应我的情况。好的,我编辑了我的代码以反映do-while循环中compsNo的增量。这就是您的意思吗?不,doWhile将始终至少执行一次,并且在location==0的情况下不会产生比较。但是计数器还是会递增的。另外,我将第一个compsNo++放在if语句之前,因为我认为无论列表中的每个项目是什么,都会对它进行比较。这是正确的,还是仅当比较值小于0时才进行计数?第一个compsNo++正常。第二个是错误的,原因是我以前写的。我明白你的意思,但我想知道,如果while条件是“while(location>0&&temp.compareTo(list[location-1])<0)”,为什么当location==0时,doWhile仍然会递增