Я пытаюсь подсчитать количество операций с массивами (присвоений в / из массива и сравнений с элементами массива), которые происходят во всем методе сортировки Shell, который принимает массив Integer.
Этокод, который использует моя сортировка Shell
public static <T extends Comparable<? super T>> void shellSort(T[] a) {
int gap = a.length / 2;
while (gap >= 1) {
if (gap % 2 == 0) {
++gap;
}
for (int i = gap; i < a.length; ++i) {
int p = i;
numAsgn++;
T temp = a[p];
numComp++;
while (p >= gap && a[p - gap].compareTo(temp) > 0) {
numAsgn++;
a[p] = a[p - gap];
p -= gap;
}
numAsgn++;
a[p] = temp;
}
if (tracing) {
System.out.println("...gap=" + gap + ": " + Arrays.toString(a));
}
gap /= 2;
}
}
Это ожидаемый вывод.
(Примечание: я выполняю то же самое для других методов сортировки, но это не имеет отношения к моему вопросу)
![This is the output I am expecting](https://i.stack.imgur.com/zl6tT.png)
Вывод, который я получаю для своего вида оболочки:
![enter image description here](https://i.stack.imgur.com/xFYqI.png)
Итак, из этого я пришел к выводу, что мне не хватает где-то обновить значение numComp
, но я не могу понять, где это находится в моем коде.Любая помощь приветствуется.
Кроме того, я попытался изменить счет таким образом.но безрезультатно.
//numComp++;
while (p >= gap && a[p - gap].compareTo(temp) > 0) {
numComp++;
numAsgn++;
a[p] = a[p - gap];
p -= gap;
}
Я не понимаю, как это возможно, поскольку цикл будет обновлять numComp++
более одного раза, но здесь число существенно ниже.
![enter image description here](https://i.stack.imgur.com/YT2jH.png)