ahorrar lineas de codigo

Iniciado por m@o_614, 25 Junio 2013, 19:08 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

Saludos tengo el siguiente codigo que me hace un simple ordenamiento burbuja de un vector:

int main()
{
   int v[MAX],i,j,n,aux,;
   printf("Dame el numero de elementos del vector\n");
   scanf("%d",&n);
   for(i=0;i < n;i++)
   {
       printf("Dame el elemento numero %d:\n",i+1);
       scanf("%d",&v[i]);
       system("cls");
   }
   for(i=1;i < n;i++)
   {
       for(j=0;j < n-i;j++)
       {
           if(v[j] > v[j+1])
           {
               aux = v[j+1];
               v[j+1] = v[j];
               v[j] = aux;
           }
       }
   }
return 0;
}
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

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

amchacon

#2
En C++ hay una forma más corta usando la función sort:

Código (cpp) [Seleccionar]
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int n = 10;

int main()
{
   vector<int> Numeros;
   int aux;

   for(int i=0;i < n;i++)
   {
       cout<<"Dame el elemento numero "<<i+1<<": "<<endl;
       cin>>aux;
       Numeros.push_back(aux);
   }

   sort(Numeros.begin(),Numeros.end()); // Ordenar desde el principio al final

   return 0;
}


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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ecfisa

#3
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:

int main()
{
 int v[MAX];
 int i, n;

 printf("Dame el numero de elementos del vector: ");
 scanf("%d",&n);
 for(i=0;i < n;i++) {
   printf("\nDame el elemento numero %d:",i+1);
   scanf("%d",&v[i]);
 }

 for (i=0; i < n; i++) {
   if (i < 1) continue;
   if (v[i] < v[i-1]) {
     v[i]   ^= v[i-1];
     v[i-1] ^= v[i];
     v[i]   ^= v[i-1];
     i = 0;
   }
 }
 ...
}

Pero, al menos yo, no veo manera de mezclar el ingreso de datos con el ordenamiento.

Saludos. :)

rir3760

Cita de: m@o_614 en 25 Junio 2013, 19:08 PMtengo 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:
#include <stdio.h>
#include <stdlib.h>

#define MAX_ELEM  16U

void swap(int *p, int *q);

int main(void)
{
   int num[MAX_ELEM];
   unsigned num_elem;
   unsigned i;
   unsigned j;
   
   printf("Numero de elementos del vector: ");
   fflush(stdout);
   if (scanf("%u", &num_elem) != 1 || num_elem > MAX_ELEM)
      return EXIT_FAILURE;
   
   for (i = 0; i < num_elem; i++){
      printf("Valor del elemento %d: ", i + 1);
      fflush(stdout);
      if (scanf("%d", num + i) != 1)
         return EXIT_FAILURE;
     
      for (j = i; j > 0 && num[j] < num[j - 1]; j--)
         swap(num + j, num + j - 1);
   }
   
   for (i = 0; i < num_elem; i++)
      printf(" %d", num[i]);
   putchar('\n');
   
   return EXIT_SUCCESS;
}

void swap(int *p, int *q)
{
   int aux;
   
   aux = *p;
   *p = *q;
   *q = aux;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language