c++ - mostrar - ordenar numeros de forma ascendente y descendente
Ordenar un vector en orden descendente (11)
El primer enfoque se refiere:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
Puede utilizar el primer enfoque porque obtiene más eficiencia que el segundo.
La complejidad del tiempo del primer acercamiento es menor que la del segundo.
Debo usar
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
o
std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators
ordenar un vector en orden descendente? ¿Hay algún beneficio o inconveniente con un enfoque u otro?
Con c ++ 14 puedes hacer esto:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
De acuerdo con mi máquina, la clasificación de un vector long long
de [1..3000000] usando el primer método toma alrededor de 4 segundos, mientras que usar la segunda toma aproximadamente el doble del tiempo. Eso dice algo, obviamente, pero tampoco entiendo por qué. Solo piensa que esto sería útil.
Lo mismo se informó here .
Como dijo Xeo, con -O3
se usa casi al mismo tiempo para terminar.
El enfoque más corto es:
std::sort(v.rbegin(), v.rend());
En lugar de un funtor como Mehrdad propuso, podrías usar una función Lambda.
sort(numbers.begin(), numbers.end(), [](const int a, const int b) {return a > b; });
En realidad, la primera es una mala idea. Usa el segundo o este:
struct greater
{
template<class T>
bool operator()(T const &a, T const &b) const { return a > b; }
};
std::sort(numbers.begin(), numbers.end(), greater());
De esa manera, su código no se romperá silenciosamente cuando alguien decida que los numbers
deben mantenerse long
o long long
lugar de int
.
No creo que debas usar ninguno de los métodos de la pregunta, ya que ambos son confusos, y el segundo es frágil como sugiere Mehrdad.
Abogaría por lo siguiente, ya que parece una función de biblioteca estándar y deja clara su intención:
#include <iterator>
template <class RandomIt>
void reverse_sort(RandomIt first, RandomIt last)
{
std::sort(first, last,
std::greater<typename std::iterator_traits<RandomIt>::value_type>());
}
Puede usar el primero o probar el siguiente código, que es igualmente eficiente:
sort(a,a+n+1,greater<int>());
Que hay de esto
std::sort(numbers.begin(), numbers.end());
std::reverse(numbers.begin(), numbers.end());
Usa el primero:
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
Es explícito de lo que está pasando, menos posibilidades de leer mal a rbegin
como begin
, incluso con un comentario. Es claro y legible, que es exactamente lo que quieres.
Además, el segundo puede ser menos eficiente que el primero dada la naturaleza de los iteradores inversos, aunque tendría que perfilarlo para estar seguro.
bool comp(int i, int j) { return i > j; }
sort(numbers.begin(), numbers.end(), comp);