Существует элегантный алгоритм линейного времени для построения максимальной кучи из набора значений, который асимптотически быстрее, чем просто делает n пузырьковых шагов.Идея состоит в том, чтобы создать лес меньших максимальных куч, а затем непрерывно объединять их попарно, пока все элементы не будут объединены в одну максимальную кучу.Используя точный анализ, можно показать, что этот алгоритм выполняется за O (n) времени с очень хорошим постоянным коэффициентом.Многие стандартные библиотеки включают эту функцию;например, C ++ имеет алгоритм std::make_heap
.
Для получения более подробной информации об этом алгоритме, включая эскиз алгоритма, доказательство корректности и анализ времени выполнения, проверьте этот предыдущий вопрос: https://stackoverflow.com/a/6300047/501557
Надеюсь, это поможет!