это O (nlgn)
вы перебираете весь массив, который занимает O (n). но на каждой итерации вы возвращаетесь обратно через массив, делив его на 2 несколько раз. поэтому каждую итерацию вы добавляете в нее lgn, которая является log base 2 из n .
Что касается улучшения, первое, что я вижу, это то, что когда heapsize равен нулю, ничего не происходит. это своего рода расточительные ресурсы ... так что, возможно, начните с 1. вот и все.