Вы могли бы использовать набор битов?Я не знаю, насколько эффективен Java BitSet.Но 9999999 возможных значений будут принимать только 9999999/8 = 1250000 байт = чуть более 1 МБ.При прохождении массива значений установите соответствующий бит в значение true.Затем вы можете пройтись по установленному биту и вывести соответствующее значение всякий раз, когда обнаружите, что бит установлен в значение true.
1 МБ уместится в кэш ЦП, поэтому это может быть весьма эффективным в зависимости от реализации набора битов.
У этого также есть побочный эффект сортировки данных.
И ... это алгоритм O (n), так как он требует одного прохода над входными данными, операций набораравны O (1) (для такого набора на основе массива), и выходной проход также равен O (m), где m - количество уникальных значений и, по определению, должно быть <= n. </p>