Invertir un vector

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
pachu23
Mensajes: 6
Registrado: 25/10/2019 10:30 pm

Invertir un vector

#1 Mensaje por pachu23 » 26/10/2019 8:52 pm

Hola, quisiera saber como invertir un vector de la siguiente manera, si tengo v = {1,2,3,4,5,6} y n = 3 tiene que quedar res = {4,5,6,1,2,3}. Otro ejemplo seria si tengo v = {1,2,3,4,5,6,7,8} y n = 4 queda res = {5,6,7,8,1,2,3,4}. Además, siempre ocurre que la longitud de v dividida n da resto 0 (eso no hace falta programarlo). Tengo una idea pero no me estaría funcionando, agradezco a quien pueda ayudarme.

Código: Seleccionar todo

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> a = {1,2,3,4,5,6};
    int n = 3;
    int count = 0;
        while(count < n) {
            for(int i = 0; i < (a.size() / n) ; i++){
                int temp;
                temp = a[n*i + count];
                a[(n*i) + count] = a[a.size() - (n * (i + 1)) + count];
                a[a.size() - (n* (i + 1)) + count] = temp;
                count++;
            }

        }

        for(int i = 0; i < a.size() ; i++){
            cout << a[i] << " ";
        }
    return 0;
    }
Para el primer ejemplo me debería dar v = {4,5,6,1,2,3} y me esta dando v = {4,5,6,0,2,3}. Si alguien puede ver el error y ayudarme se lo agradecería un montón. Saludos

dehm
Mensajes: 329
Registrado: 29/04/2011 7:31 am

Re: Invertir un vector

#2 Mensaje por dehm » 27/10/2019 2:22 pm

Un algoritmo, que seguramente no será el más eficiente, es mover los valores de los arrays un puesto a la izquierda tantas veces como marque el número y el primero de ellos llevarlo al final. Una especie de movimiento circular.
De esta forma:

Código: Seleccionar todo

a = {1,2,3,4,5,6};
int n = 3;
Entonces hacemos la operación tantas veces como marque el bucle. En este caso 3
array de partida -> 1,2,3,4,5,6
1º movimiento -> 2,3,4,5,6,1
2º movimiento -> 3,4,5,6,1,2
3º movimiento -> 4,5,6,1,2,3 -->y este es el resultado

Como ves, lo que hemos hecho es mover los valores de los arrays un puesto a la izquierda tantas veces como marque el numero, y el primero llevarlo al final.
Si no lo ves o necesitas más ayuda o el código, dilo y lo dejamos resuelto. Pero es fácil sabiendo que en cada paso del bucle habrá que hacer

Código: Seleccionar todo

a[i]=a[i+1]
De esta forma cada posición del array toma el valor del posterior.
Y como primera acción en cada paso del bucle, no olvides guardar el valor del a[0] para luego asignarlo al último índice del array.
Aprendiendo

pachu23
Mensajes: 6
Registrado: 25/10/2019 10:30 pm

Re: Invertir un vector

#3 Mensaje por pachu23 » 27/10/2019 10:53 pm

Hola dehm, mil gracias por responder. Estuve tratando de hacer lo que dijiste pero realmente no me sale, no entiendo porque movieras el numero a la derecha con a = a [i+1] siendo que ahi lo estarias corriendo a la derecha. Te agradezco si sos tan amable de pasarlo resuelto para poder entenderlo. Gracias y saludos.

dehm
Mensajes: 329
Registrado: 29/04/2011 7:31 am

Re: Invertir un vector

#4 Mensaje por dehm » 28/10/2019 1:38 am

Hola de nuevo.

Como te dije, la mecánica es tan sencilla como mover cada valor a su índice anterior, y el primero llevarlo al final. Como si de un movimiento circular se tratara, estando el primer elemento conectado con el último.
Partimos de este vector:
vector<int> a = {1,2,3,4,5,6};
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=6

Pues bien, vamos a correr todos los valores un puesto hacia atrás, y el valor 0 al moverlo hacia atrás ocupa el último índice del array:
Para n = 3

Paso 1:

a[0]=2 //a[ i ] = a[ i+1 ]...como ves, a[0] toma el valor de a[1]. Esto se repite para todos excepto para el ultimo índice, que toma el valor del primero
a[1]=3
a[2]=4
a[3]=5
a[4]=6
a[5]=1//a[size-1] = a[0]

Paso 2:

a[0]=3 //a[ i ] = a[ i+1 ]...como ves, a[0] toma el valor de a[1]. Esto se repite para todos excepto para el ultimo índice, que toma el valor del primero
a[1]=4
a[2]=5
a[3]=6
a[4]=1
a[5]=2 //a[size-1] = a[0]

Paso 3:

a[0]=4 //a[ i ] = a[ i+1 ]...como ves, a[0] toma el valor de a[1]. Esto se repite para todos excepto para el ultimo índice, que toma el valor del primero
a[1]=5
a[2]=6
a[3]=1
a[4]=2
a[5]=3 //a[size-1] = a[0]

Y en código (es bastante autoexplicativo):

Código: Seleccionar todo

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> a = {1,2,3,4,5,6};
    int n = 3;
    int aux;
    for (int i=0;i<n;i++)
    {
        aux = a[0];//capturo el primero valor
        for (int j=0;j<a.size();j++)
        {
            a[j]=a[j+1];//corro cada valor del array al anterior
        }
        a[a.size()-1]=aux;//finamente, asigno al último índice del array el valor del primero obtenido anteriormente.
    }
    for(int i = 0; i < a.size() ; i++)
    {
        cout << a[i] << " ";
    }
    return 0;
}
Aprendiendo

Avatar de Usuario
kiko66
Mensajes: 44
Registrado: 11/10/2019 10:51 am

Re: Invertir un vector

#5 Mensaje por kiko66 » 28/10/2019 8:59 am

hola pachu

la idea primera de intercambiar posiciones parece la mas sencilla, aunque hay que reconocer que la de dehm es divertida :)

te paso el codigo con un algoritmo de intercambio en c:

Código: Seleccionar todo

#include <stdio.h>

void muestraVector(int* vec, int n2){ // visualiza los elementos del vector

   printf("\nAhora el vector contiene: ");
   for(int v=0; v<n2 ;v++) 
      printf("%d ", vec[v]);
   puts("\n");
}

int main(void){

   int n=3;                 // mitad de elemantos del vector
   int vec[]={1,2,3,4,5,6}; // contenido del vector

   muestraVector(vec, n*2);
   for(int i=0, tmp; i<n ;i++){ // intercambio n elementos
      tmp=vec[i];
      vec[i]=vec[i+n];
      vec[i+n]=tmp;
   }
   muestraVector(vec, n*2);

   return 0;
}
espero te sirva :wink:
para cuando el resaltado de codigo por ej como forosdelweb, asi es muy soso :roll:

saludos

dehm
Mensajes: 329
Registrado: 29/04/2011 7:31 am

Re: Invertir un vector

#6 Mensaje por dehm » 28/10/2019 9:59 am

kiko66 escribió:
28/10/2019 8:59 am
hola pachu

la idea primera de intercambiar posiciones parece la mas sencilla, aunque hay que reconocer que la de dehm es divertida :)

te paso el codigo con un algoritmo de intercambio en c:

Código: Seleccionar todo

#include <stdio.h>

void muestraVector(int* vec, int n2){ // visualiza los elementos del vector

   printf("\nAhora el vector contiene: ");
   for(int v=0; v<n2 ;v++) 
      printf("%d ", vec[v]);
   puts("\n");
}

int main(void){

   int n=3;                 // mitad de elemantos del vector
   int vec[]={1,2,3,4,5,6}; // contenido del vector

   muestraVector(vec, n*2);
   for(int i=0, tmp; i<n ;i++){ // intercambio n elementos
      tmp=vec[i];
      vec[i]=vec[i+n];
      vec[i+n]=tmp;
   }
   muestraVector(vec, n*2);

   return 0;
}
espero te sirva :wink:
para cuando el resaltado de codigo por ej como forosdelweb, asi es muy soso :roll:

saludos
Esa solución solo va a valer cuando permutes la mitad de las posiciones por las otras. Si n no vale la mitad del tamaño del vector no te va a funcionar. :cry:
Aprendiendo

Avatar de Usuario
kiko66
Mensajes: 44
Registrado: 11/10/2019 10:51 am

Re: Invertir un vector

#7 Mensaje por kiko66 » 28/10/2019 10:14 am

hola dehm

por lo que ha dicho pachu y los ejemplos que ha puesto doy por echo que es asi
invierte la mitad del vector con la otra mitad

:idea: si es de otra manera siempre puede especificarlo y poner algun ejemplo que clarifique como
seria la inversion que quiere o si lo que quiere son desplazamientos .... a la der o a la izq ¿¿??

por ej diga si seria valido v[]={1,2,3,4,5,6,7,8,9} con n=3; o v[]={1,2,3,4,5,6,7,8} con n=2

y si es asi muestre como quedaria una vez invertido :wink:

saludos

dehm
Mensajes: 329
Registrado: 29/04/2011 7:31 am

Re: Invertir un vector

#8 Mensaje por dehm » 28/10/2019 11:58 am

kiko66 escribió:
28/10/2019 10:14 am
hola dehm

por lo que ha dicho pachu y los ejemplos que ha puesto doy por echo que es asi
invierte la mitad del vector con la otra mitad

:idea: si es de otra manera siempre puede especificarlo y poner algun ejemplo que clarifique como
seria la inversion que quiere o si lo que quiere son desplazamientos .... a la der o a la izq ¿¿??

por ej diga si seria valido v[]={1,2,3,4,5,6,7,8,9} con n=3; o v[]={1,2,3,4,5,6,7,8} con n=2

y si es asi muestre como quedaria una vez invertido :wink:

saludos
Pues tienes razón, parece que la idea es pasar la mitad posterior a la anterior y viceversa. :lol:
Aprendiendo

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados