В общем, вы можете найти K самых больших (или самых маленьких) чисел в массиве, используя один проход для любого K. Общая сложность времени будет O (NK), где N - размер массива:
Хранить отсортированный список чисел, который имеет не более K элементов. Пройдите через массив и для каждого элемента:
- , если список еще не заполнен, вставить элемент
- В противном случае, если элемент больше, чем наименьший элемент в списке, вставьте этот элемент и удалите наименьший.
В конце концов, список будет содержать K самых больших элементов, что мы и хотели.
Это решение довольно медленное, хотя. Используя самобалансирующееся двоичное дерево поиска или список пропусков, вы можете добраться до O (N log K). (Поскольку в общем случае сортировка невозможна быстрее, чем O (N log N), и этот метод можно использовать для сортировки всего массива, если мы установим K = N, это выглядит как лучшее, что мы можем получить.)
В случае K = 2 вам не нужна вся эта тяжелая техника. Достаточно двух переменных, представляющих две позиции в списке.