Я думаю, что в общем случае вы должны использовать, вы используете алгоритм QuickSelect, который основан на QuickSort и, со временем O (n) изменяет ваш массив в строке и «квази-сортирует» его.
Скажем, ваш массив A [1..10] и не отсортирован, вызывая QuickSelect (A, 7), вы спрашиваете: «Какое число в отсортированном массиве должно быть на седьмой позиции?», И это то же самое, что сказать «Какое число на треть больше в этом конкретном массиве?». Теперь замечательно, что QuickSelect гарантирует, что после этого вызова A [i] <= A [7] для всех 0 <i <7 и что A [7] <= A [j] для всех 7 <j. Больше информации в википедии <a href="http://en.wikipedia.org/wiki/Selection_algorithm#Selecting_k_smallest_or_largest_elements" rel="nofollow noreferrer"> Алгоритм быстрого выбора .
В любом случае, так как размер всего 10, вы можете использовать вставку-сортировку (худший случай O (n ^ 2), но хорошо работает с небольшими массивами), а затем получить три первых / последних элемента
EDIT:
- Древовидные структуры - это перебор только для десяти элементов, и, как правило, это компромисс между временем и пространством (вам нужно много указателей)
- QuickSelect имеет O (n ^ 2) в худшем случае, но «Медиана медиан» достигает того же результата в худшем случае O (n)