Я думаю, что ошибка в этом коде:
for( ; getChild(hole) <= size(); hole = child) {
for(int i = 0; i < d && tempChild != size(); i++, tempChild++){
if(heapArray[tempChild + 1].compareTo(heapArray[child]) < 0){
child = tempChild + 1;
}
}
if (heapArray[child].compareTo(tempElement) < 0)
heapArray[hole] = heapArray[child];
else
break;
}
Обратите внимание, что в этом цикле вы изменяете значение child
только во вложенном цикле for
, но никогда в другом месте. Это означает, что если на какой-то конкретной итерации ни один из дочерних узлов текущего узла не меньше, чем элемент с индексом child
, то child
никогда не переназначается и при выполнении условия шага цикла hole = child
ничего не произойдет. Кажется, что если вам не повезло с вашей структурой кучи, это может легко вызвать бесконечный цикл.
Аналогично, в этом цикле вы никогда не переназначаете tempChild
, поэтому на каждой итерации tempChild
будет выбирать, где он остановился на предыдущей итерации. Если на одной из этих итераций tempChild
был равен size
, то внутренний цикл никогда не будет выполнен, и каждая итерация цикла не будет иметь никакого эффекта, снова вызывая бесконечный цикл.
Чтобы исправить это, я думаю, вы хотите пересчитать tempChild
и index
на каждой итерации, как показано здесь:
for( ; getChild(hole) <= size(); hole = child) {
child = getChild(hole);
int tempChild = getChild(hole);
for(int i = 0; i < d && tempChild != size(); i++, tempChild++){
if(heapArray[tempChild + 1].compareTo(heapArray[child]) < 0){
child = tempChild + 1;
}
}
if (heapArray[child].compareTo(tempElement) < 0)
heapArray[hole] = heapArray[child];
else
break;
}
Я не уверен, что это правильно, потому что я не могу проверить это без доступа к базовому классу, но, похоже, это виновник. Попробуйте и дайте мне знать, как это работает.