I don't see much to improve from algorithmic point of view. So I will focus on Object Oriented design. 1. How about doing it similarly to Sort method? I mean instead of making abstract method, try just injecting Comparator into generic Heap implementation. 2. People are generally scary of long and complex code. It would be nicer to try to split it into smaller parts: - First (most general) concept is to extract each huge operation (like `Find`, `Downheap` etc) into separate class with appropriate Single Responsibility. They usually accept in constructor original method parameters, hold its internal state as fields instead of local variables. <br /> <br /> They can also accept in constructor reference to original object but it would be even better design practice to extract internal Heap state into even smaller object and avoid circular dependency. - Second idea would be to separate defensive programming from actual algorithms to make them cleaner and more readable (I would suggest to move them into a class mentioned in point 3. or into separate `Facade` responsible for validating user input) 3. You mentioned, that you struggled a little bit with `collections.generic` interfaces. My proposed solution would be not to pollute actual implementation but instead use `Adapter` Design Pattern <s>4. Another thing that comes into mind (beside OO) is to calculate `numberOfLevels` from either `Count` or `capacity` (using ceiled logarithm)</s> As #harold mention in comment it is probably unused