Кучи кажутся очень подходящими, и кажется, что вы делаете это неправильно.
Скажем, вы хотели, чтобы верхние элементы х (как этот х сравнивается с n, кстати?)
То, что вы делаете, это складываете все в максимальную кучу и получаете топ x.
Я предлагаю вместо этого использовать минимальную кучу ровно x элементов.
Первые x элементов, которые вы вставляете в кучу.
Следующий входящий элемент, вы сравниваете с минимумом, который может быть сделан очень быстро (O (1) время) в куче. Если меньше, вы просто игнорируете входящий элемент.
Если входящий элемент больше чем min, то вы увеличиваете min до входящего элемента и просеиваете его в куче. Это должно быть время logx в худшем случае.
После этого (по времени nlogx) вы можете извлечь элементы из кучи в отсортированном порядке за время O (xlogx).
В зависимости от того, как ваши данные (и насколько мал x), использование этого решения с минимальной кучей может быть очень быстрым.
Если вы действительно хотите, чтобы вставки были суперскоростными и не заботились о поиске, вы также можете сделать следующее.
Вставить элементы в вектор (массив с амортизированным временем вставки O (1)) в порядке их поступления.
Используйте алгоритм Selection, чтобы найти x-й по величине элемент (за O (n) времени, но константы могут быть большими). Скажите, что это число S.
Теперь пройдитесь по массиву, сравнивая каждый элемент с S и выберите те, которые равны S.
Если x имеет разумный размер и сравним с n (например, n / 2 или что-то в этом роде), это может сработать, но если x мало по сравнению с n, я бы предложил использовать минимальную кучу.