Самое быстрое решение - использовать алгоритм выбора на основе разделов , который работает в O(n)
. Он основан на идее быстрой сортировки, за исключением того, что вместо рекурсивной сортировки обоих разделов вы переходите только к одному из разделов, чтобы найти самый маленький элемент k-th
.
Нахождение наибольшего 10% достигается путем поиска k=(90%*N)-th
наименьшего числа.
Если вы помните, как работает разбиение в быстрой сортировке, элементы, меньшие, чем стержень, перемещаются влево, а остальные элементы - вправо. Допустим, вы хотите выбрать самый маленький элемент k-th
. Затем вы увидите, есть ли хотя бы k
элементов слева от оси. Если есть, то вы знаете, что можете игнорировать элементы в правильном разделе. В противном случае вы можете игнорировать все элементы в левом разделе, потому что вы знаете, что этот элемент будет в правом разделе.
Обратите внимание, что алгоритм выбора определяет только те верхние 10% чисел. Если вам нужно, чтобы они были отсортированы, то вам нужно отсортировать эти числа (но только эти числа, остальные 90% можно игнорировать).