我正在尝试使用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++;
}
}
}
答案 0 :(得分:2)
如果您想计算比较数,则应在包含调用compsNo
的每一行之前或之前增加compareTo
。
在您的代码中,您有两次compareTo
次调用,只有一次compsNo++
。