Никакой общий алгоритм сортировки не может сделать это за O (n) время. Кроме того, без дополнительных ограничений (например, миллиарды чисел берутся из чисел от 1 до 1 000 000) вообще не существует алгоритма сортировки, который будет работать для этого.
Однако, есть простое O (n ) алгоритм для этого:
- инициализировать буфер возврата с 1 000 000 пустых ячеек
- для каждого элемента в вашем списке 1 000 000 000, выполните следующие действия:
- проверьте каждый из 1 000 000 ячеек в порядке
- , если число на входе больше, чем число в вашем буфере, меняйте их местами и продолжайте идти
- , если вы смотрите на пустую ячейку, поместите номер, который вы удерживаете
- , если вы дойдете до конца списка и удерживаете номер, выбросьте его
Вот пример со списком из 10 вещей, и мы хотите самое большое 5:
Input: [6, 2, 4, 4, 8, 2, 4, 1, 9, 2]
Buffer: [-, -, -, -, -]
[6, -, -, -, -] … see a blank, drop the 6
[6, 2, -, -, -] … 2 < 6, skip, then see a blank, drop the 2
[6, 4, 2, -, -] … 4 < 6 but 4 > 2, swap out 2, see blank, drop 2
[6, 4, 4, 2, -] … 4 <= 4,6 but 4 > 2, swap out 2, see blank, drop 2
[8, 6, 4, 4, 2] … 8 > 6, swap, then swap 6 for 4, etc.
[8, 6, 4, 4, 2] … 2 <= everything, drop it on the floor
[8, 6, 4, 4, 4] … 4 <= everything but 2, swap, then drop 2 on floor
[8, 6, 4, 4, 4] … 1 <= everything, drop it on the floor
[9, 8, 6, 4, 4] … 9 > everything, swap with 8 then drop a 4 on the floor
[9, 8, 6, 4, 4] … 2 <= everything, drop it on the floor
Вы делаете 1 000 000 сравнений и, возможно, до 1 000 000 свопов для каждого элемента на входе (рассмотрите вход в отсортированном порядке возрастания). Это означает, что вы выполняете работу, пропорциональную 1 000 000 * n, линейный объем работы в размере ввода n.