Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 25 Junio 2013, 19:08 pm



Título: ahorrar lineas de codigo
Publicado por: m@o_614 en 25 Junio 2013, 19:08 pm
Saludos tengo el siguiente codigo que me hace un simple ordenamiento burbuja de un vector:

Código
  1. int main()
  2. {
  3.    int v[MAX],i,j,n,aux,;
  4.    printf("Dame el numero de elementos del vector\n");
  5.    scanf("%d",&n);
  6.    for(i=0;i < n;i++)
  7.    {
  8.        printf("Dame el elemento numero %d:\n",i+1);
  9.        scanf("%d",&v[i]);
  10.        system("cls");
  11.    }
  12.    for(i=1;i < n;i++)
  13.    {
  14.        for(j=0;j < n-i;j++)
  15.        {
  16.            if(v[j] > v[j+1])
  17.            {
  18.                aux = v[j+1];
  19.                v[j+1] = v[j];
  20.                v[j] = aux;
  21.            }
  22.        }
  23.    }
  24. return 0;
  25. }
pero tengo la duda de si en vez de usar dos fors podria meter el metodo de ordenamiento en el for que me pide que ingrese los elementos del vector para ahorrar lineas de codigo

gracias


Título: Re: ahorrar lineas de codigo
Publicado por: engel lex en 25 Junio 2013, 21:22 pm
no, necesitas 2 for porque buble sort es de tiempo exponencial... el por ley tiene que pasar n veces por cada uno de sus n miembros... de los algoritmos de ordenamiento buble sort a pesar de ser el de más simple implementacion, es el más lento de todos


Título: Re: ahorrar lineas de codigo
Publicado por: amchacon en 25 Junio 2013, 21:42 pm
En C++ hay una forma más corta usando la función sort:

Código
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int n = 10;
  8.  
  9. int main()
  10. {
  11.    vector<int> Numeros;
  12.    int aux;
  13.  
  14.    for(int i=0;i < n;i++)
  15.    {
  16.        cout<<"Dame el elemento numero "<<i+1<<": "<<endl;
  17.        cin>>aux;
  18.        Numeros.push_back(aux);
  19.    }
  20.  
  21.    sort(Numeros.begin(),Numeros.end()); // Ordenar desde el principio al final
  22.  
  23.    return 0;
  24. }

Aparte de eso, no se me ocurre ninguna forma de acortar tu código. Como mucho podrías sacar el mayor número del vector, pero eso no te serviría para ahorrar código.


Título: Re: ahorrar lineas de codigo
Publicado por: ecfisa en 25 Junio 2013, 23:11 pm
Hola.

Si usas C y tenés que aplicar el método de la burbuja si o si, podes ahorrar un ciclo en el ordenamiento y la variable auxilar de este modo:
Código
  1. int main()
  2. {
  3.  int v[MAX];
  4.  int i, n;
  5.  
  6.  printf("Dame el numero de elementos del vector: ");
  7.  scanf("%d",&n);
  8.  for(i=0;i < n;i++) {
  9.    printf("\nDame el elemento numero %d:",i+1);
  10.    scanf("%d",&v[i]);
  11.  }
  12.  
  13.  for (i=0; i < n; i++) {
  14.    if (i < 1) continue;
  15.    if (v[i] < v[i-1]) {
  16.      v[i]   ^= v[i-1];
  17.      v[i-1] ^= v[i];
  18.      v[i]   ^= v[i-1];
  19.      i = 0;
  20.    }
  21.  }
  22.  ...
  23. }
  24.  
Pero, al menos yo, no veo manera de mezclar el ingreso de datos con el ordenamiento.

Saludos. :)


Título: Re: ahorrar lineas de codigo
Publicado por: rir3760 en 27 Junio 2013, 03:23 am
tengo la duda de si en vez de usar dos fors podria meter el metodo de ordenamiento en el for que me pide que ingrese los elementos del vector para ahorrar lineas de codigo
Puedes combinar la ordenacion y la entrada de datos para reducir el numero de lineas pero, como ya te comentaron, eso no afecta el rendimiento del algoritmo.

Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_ELEM  16U
  5.  
  6. void swap(int *p, int *q);
  7.  
  8. int main(void)
  9. {
  10.   int num[MAX_ELEM];
  11.   unsigned num_elem;
  12.   unsigned i;
  13.   unsigned j;
  14.  
  15.   printf("Numero de elementos del vector: ");
  16.   fflush(stdout);
  17.   if (scanf("%u", &num_elem) != 1 || num_elem > MAX_ELEM)
  18.      return EXIT_FAILURE;
  19.  
  20.   for (i = 0; i < num_elem; i++){
  21.      printf("Valor del elemento %d: ", i + 1);
  22.      fflush(stdout);
  23.      if (scanf("%d", num + i) != 1)
  24.         return EXIT_FAILURE;
  25.  
  26.      for (j = i; j > 0 && num[j] < num[j - 1]; j--)
  27.         swap(num + j, num + j - 1);
  28.   }
  29.  
  30.   for (i = 0; i < num_elem; i++)
  31.      printf(" %d", num[i]);
  32.   putchar('\n');
  33.  
  34.   return EXIT_SUCCESS;
  35. }
  36.  
  37. void swap(int *p, int *q)
  38. {
  39.   int aux;
  40.  
  41.   aux = *p;
  42.   *p = *q;
  43.   *q = aux;
  44. }

Un saludo