Вы задаете не тот вопрос. Вместо того, чтобы просить о сложности времени, вы должны спросить, является ли то, что вы делаете, правильно определенным поведением.
Ответ: push_heap
имеет предварительное условие, что диапазон, который вы передаете, является допустимой кучей. Точнее, если вы дадите ему диапазон [first, last[
, то в качестве кучи потребуется только [first, last-1[
, и будет вставлен элемент в last-1
. Поэтому, если это предварительное условие не выполняется, поведение не определено (и это имеет место с push_heap
, как с любыми другими алгоритмами STL, насколько я знаю). Но если предварительное условие выполнено, вы гарантированно получите O (log N) здесь.
В вашем примере куча все еще действует, потому что вы меняете последний элемент (который не обязательно должен быть частьюкуча), поэтому сложность остается O (log N). Если бы это больше не было кучей, теоретически, все могло бы произойти: Crash, O (n), O (2 ^ n), драконы в носу.
На практике, однако, сложность останется на O (logN) потому что новая запись все равно будет просеиваться при максимальных слоях кучи O (log N), даже если один из них неправильный, и отсеивание останавливается неправильно (на самом деле, если куча неверна в первую очередь, не может быть «правильной»)просеивание).