Zależy z jakiego przedziału są to liczby, jeżeli są to liczby z małego przedziału, na przykład od 0-100, to najszybciej będzie jak zarezerwujesz tablice stuelemntową i przejdziesz po wszystkich liczbach pętlą
int a[20] = { 16, 2, 77, 40, 12, ... };
int*t= new int[100];
for (int i=0; i < 20; i++)
t[a[i]]=1;
delete t;
Na końcu wybierasz tylko te elementy tablicy, które są równe jeden. Złożoność obliczeniowa to O(k) gdzie k to długość przedziału, a złożoność pamięciowa to też k.
Przy przedziale większym na przykład 0-10000 to najlepiej dane mimo wszystko przesortować. Jeżeli zrobisz to QuickSortem to złożoność obliczeniowa wnosi O(nlog(n)), potem tylko sprawdzasz czy kolejny element tablicy jest taki jak poprzedni, jeżeli rożny to OK jeśli taki sam to go pomijasz, złożoność tej pętli to O(n) co w sumie daje O(nlog(n)).