Ordenar es muy util para resolver problemas. Muchos problemas que son dificiles o “imposibles” sobre arreglos desordenados, son fáciles o, por lo menos, más fáciles sobre arreglos ordenados.
Implementar un algoritmo de ordenamiento eficiente no es tan sencillo pero, por
suerte, C++ ya trae uno: sort(l, r)
.
sort
toma dos iteradores como argumento. No viene al caso saber qué son. (se
puede googlear) Lo que nos importa es que para ordenar un vector se usa así:
vector<int> v = { 10, 100, 1 };
sort(begin(v), end(v));
Y para ordenar los primeros n
elementos de un array se usa así:
int a[1000];
sort(a, a+n);
Algo que surge en muchisimos problemas es contar la cantidad de valores distintos en un array.
Resulta que si el array está ordenado es muy fácil:
Si el array no está ordenado, lo ordenamos y listo.
En código es una cosa así:
sort(a, a+n);
int cantidad = 1;
forr(i, 1, n) {
if (a[i-1] != a[i]) {
cantidad++;
}
}
Estas ideas de “los elementos iguales están juntos” y “tal cosa vale porque todos los elementos anteriores son menores” son extremadamente comunes y aparecen en cientos de problemas.