0

Quiero ordenar numeros, con un ciclo "for", pero quisiera que el ciclo ordenando en pares de derecha a izquierda. De antemano gracias a todos los que respondan.

#include<iostream>
#include<stdlib.h>

using namespace std;

int main()
{

    int arreglo[3] = {4,2,1};
    int i, var_aux;

    for(i=3; i<3; i--)
    {
      if(arreglo[i] < arreglo[i-1])
        {
            var_aux = arreglo[i];
            arreglo[i] = arreglo[i-1];
            arreglo[i-1] = var_aux;
        }
    }

    for(i=0; i<3; i++)
    {
        cout << " " << arreglo[i];
    }
    return 0;
}

2 Answers2

2

quiero que el ciclo “for” vaya de derecha a izquierda

Mala suerte, for no entiende eso de derecha e izquierda. El sentido es algo que le proporcionas tu al usuario, ya que el for únicamente es capaz de repetir un código un número determinado de veces.

Así que, siendo correctos, digamos que lo que pretendes es recorrer el array a la inversa. Bien, en C++ los índices empiezan en 0, luego si un array tiene, por ejemplo, 3 elementos, el último índice válido será 2 y no 3, luego tu for ya empieza teniendo cosas raras:

for(i=3; i<3; i--)
//    ^ Debería ser 2

Por otro lado, si recorres el array a la inversa, la condición del bucle debería ser que el valor de i sea mayor o igual a 0, ya que la secuencia que pretendes reproducir es 2, 1, 0... el condicional del bucle también está mal

for(i=2; i<3; i--)
//       ^^^ Debería ser i>=0

Y con eso el bucle ya estaría arreglado... o no... vamos a echar un vistazo a las instrucciones que se ejecutan en el bucle:

var_aux = arreglo[i];
arreglo[i] = arreglo[i-1];
arreglo[i-1] = var_aux;

Con las condiciones que hemos puesto, i se moverá en el rango de valores 2..0, lo cual es correcto... pero i-1 se moverá en el rango 1..-1 y eso no pinta tan bien. No debemos dejar que ningún índice acceda a elementos que no pertenecen al array, así que podemos optar por reducir el rango de iteración:

for(i=2; i>0; i--)

Ahora, i se moverá en 2..1, mientras que i-1 lo hará en 1..0. Ya no hay accesos fuera del array.

eferion
  • 49,291
  • 5
  • 30
  • 72
2

Puedes usar un iterador inverso:

for (auto i = rbegin(arreglo), e = rend(arreglo) - 1; i != e; ++i)
{
    if (*i < *(i + 1))
    {
        swap(*i, *(i + 1));
    }
}

También he usado la utilidad std::swap para simplificar el código. El iterador i apunta al final del arreglo (que es el principio si lo recorremos en sentido inverso) mientras que el iterador e apunta al anterior del final del arreglo (que es el primer elemento si lo recorremos en sentido inverso).

Otras cosas a tener en cuenta.

  • La cabecera <stdlib.h> es de no de . No deberías usar en C++ cabeceras de C, si realmente necesitas usarlas (que rara vez será el caso) deberías usar la cabecera adaptada a C++ que en este caso sería <cstdlib>(sin extensión y con c como prefijo) lee este hilo para saber más del tema.
  • No usas la cabecera <stdlib.h> para nada. Además de que no deberías estar incluyendo esa cabecera, no usas ninguna de las herramientas que te ofrece, así que la estás incluyendo sin motivo. No la incluyas.
  • No es necesaria la cláusula using namespace std; pues tan sólo es una ayuda a la escritura; no pasa nada por usarla pero si la usas procura que sea en el ámbito más pequeño posible; lee este hilo para saber más del tema.
  • Procura favorecer el pre-decremento (o incremento) frente al post-decremento (o incremento), lee este artículo para saber más del tema.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82