He estado mirando el std :: algoritmo nth_element que al parecer:¿Cuál es la diferencia práctica entre std :: nth_element y std :: sort?
reordena los elementos en el rango [primero, último), de tal manera que el elemento en la posición enésima resultante es la elemento que sería en esa posición en una secuencia ordenada, sin ninguno de los elementos anterior a que sea mayor y ninguno de los elementos que lo siguen más pequeño que él. Ni los elementos que lo preceden ni los elementos que le siguen están garantizados para ser pedidos.
Sin embargo, con mi compilador, ejecutando el siguiente:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for (int i = 0; i < 10; i++)
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+4, myvector.end());
// print results
for (auto it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
Siempre devuelve una lista ordenada de números enteros completamente exactamente de la misma manera que std :: sort hace. ¿Me estoy perdiendo de algo? ¿Para qué es útil este algoritmo?
EDITAR: Ok el siguiente ejemplo usando un conjunto mucho más grande muestra que hay una gran diferencia:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for (int i = 0; i < RAND_MAX; i++)
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+rand(), myvector.end());
vector<int> copy = myvector;
std::sort(myvector.begin(), myvector.end());
cout << (myvector == copy ? "true" : "false") << endl;
El hecho de que su implementación lo haga por algunos ejemplos simples, no significa que siempre lo haga, ni que todas las demás implementaciones lo hagan. – PlasmaHH
¿Qué compilador, qué implementación de biblioteca? Pruebe matrices más grandes del orden de 10000. –
Bueno, usar 'sort' internamente como un alias para' nth_element' cumple con la defición formal. –