La eficiencia es un término que suele ser complicado de acotar. Te pongo algunas notas genéricas:
* La eficiencia se mide únicamente por tiempo, por consumo de memoria o por un equilibrio entre ambos?
* Depende del número de elementos a manejar. El algoritmo más eficiente para una población pequeña suele ser diferente del más eficiente para una población grande.
* Depende de los requisitos de la aplicación
* Depende de la arquitectura de la máquina sobre la que funciona el algoritmo.
A modo de ejemplo, para rellenar un vector de 10 elementos no vas a notar ninguna diferencia entre usar un algoritmo super optimizado y el que tienes ya hecho... si en vez de 10 elementos quieres conseguir, no se, 5.000 millones de números pues ya la cosa cambia ( nota que ya no te valdría el tipo int ).
No se, si tu idea es conseguir una colección de 10 números únicos partiendo de un grupo inicial de 15 números podrías probar a crear primero un array con los 15 números y a sacar 10 números al azar... o también puedes desordenar esa colección de 15 números y quedarte únicamente con los 10 primeros:
const int PopulationSize = 20;
const int ArraySize = 19;
int main(){
int population[ PopulationSize ];
for ( int i=0; i < PopulationSize; i++ )
population[ i ] = i+1;
int arreglo[ ArraySize ];
srand(time(0));
for(int i = 0; i < PopulationSize; i++)
{
int j = rand() % PopulationSize;
if ( i == j )
j = ( i + 1 ) % PopulationSize;
std::swap( population[i], population[j]);
}
for ( int i = 0; i < ArraySize; ++i )
{
arreglo[ i ] = population[ i ];
std::cout << arreglo[ i ] << std::endl;
}
return 0;
}