Invert array (vector) without an external function, 'manually'

5

Friends, I always inverted vectors using a helper in an external function (I think the default way), but until recently a friend told me that I had a way to invert vectors without using a helper, I asked to show myself but it turned out What did not you show me? I searched the net for something done in such a way and found nothing. How do I do this.

     aux = vetor[i+8];
     vetor[i+8] = vetor[i];
     vetor[i] = aux;
    
asked by anonymous 31.05.2016 / 15:05

2 answers

6

The trick is to build the for loop, you have to count from the end to the beginning of the array (vector)

#include <stdio.h>

int main() {

   int original[] = {1,2,3,4,5,6};
   int count = sizeof(original) / sizeof(int); // 6, numero de elementos no array original 
   int revertido[count], i, j; // declaramos que o array revertido vai ter o mesmo numero de elementos que original

   // vamos iniciar o i em count - 1, (5 indexes dos elementos do array original) vai servir para percorrermos o original do fim para o inicio, subtraimos 1 a cada volta
   // vamos iniciar o j em 0 para podermos armazenar cada valor do original a partir do index 0 no array revertido, j vai ser cada index do array revertido
   // o loop e finalizado quando j < count (quando j for 5), iria dar o mesmo resultado se a condicao fosse i >= 0

   for (i = count-1, j = 0; j < count; i--, j++) {
      revertido[j] = original[i]; // no primeiro loop o ultimo valor do original vai ser o primeiro valor (com index 0) do array revertido, no segundo loop o penultimo do original vai ser o segundo do revertido, etc...
   }

   for (i = 0; i < count; i++) {
      printf("%d \n", revertido[i]);
   }

   return (0);
}

Once you understand the logic, if you want to simplify, you can solve using only the variable i in the loop, and thus we do not even need j :

for ( i = 0; i < count; i++) {
   revertido[i] = original[count - i - 1];
}

// Se i for zero, count - i - 1 será o
// último elemento (original[6 - 0 - 1] = original[5]), se for 1, será o
// penúltimo, e assim sucessivamente.
    
31.05.2016 / 15:11
2

Although your question is in C language, just as a contribution to your question, in the C ++ language (Object Oriented) we can use a very useful method to do this and abstract this complexity:

#include <vector>
#include <algorithm>

void main() {
  std::vector<int> vetor_xpto;
  //quando popular pode usar...
  std::reverse(vetor_xpto.begin(), vetor_xpto.end());
}
    
31.05.2016 / 15:59