Página principal | Módulos | Lista de componentes | Lista de archivos | Archivos de los miembros

histograma.c

Ir a la documentación de este archivo.
00001 
00044 #include <stdio.h>
00045 #include <stdlib.h>
00046 #include <time.h>
00047 #include <sys/time.h>
00048 #include <math.h>
00049 #include "definicion.h"
00050 
00051 int main(int argc, char *argv[])
00052 {
00053   FILE *archivo;
00054   int repeticiones, n_datos, k;
00055   int seg_i, seg_f; //variables que manejan el tiempo de duracion del ordenamiento
00056   int *arreglo;                 //puntero al arreglo de elementos
00057   int *intervalo_tiempo;
00058   int *datos_histograma;
00059   char *valida[2];      //variable empleada en la verificacion de parametro.
00060   double t_dif; //variables que manejan el tiempo de duracion del ordenamiento
00061   double t_suma, promedio_q, promedio_h; //vriables
00062        
00063 
00064   // validar que haya exactamente 2 parametros en la linea de comandos
00065   if (argc !=3) {
00066     printf("Uso: %s [Numero Repeticiones] [Numero de Datos]\n",argv[0]);
00067     exit(1);
00068   }
00069 
00070   // validar que el parametro sea un numero entero positivo
00071   repeticiones = strtol(argv[1],valida,10);
00072   if ( (repeticiones < 1) || (**valida != 0))
00073     {
00074       printf("Uso: %s [Numero Repeticiones] [Numero de Datos]\n",argv[0]);
00075       exit(2);
00076     }
00077 
00078   n_datos = strtol(argv[2],valida,10);
00079   if ( (n_datos < 1) || (**valida != 0))
00080     {
00081       printf("Uso: %s [Numero Repeticiones] [Numero de Datos]\n",argv[0]);
00082       exit(2);
00083     }
00084 
00085          
00086   t_suma2 = 0; // suma de los tiempos al cuadrado
00087   /*
00088     n_datos = 7;
00089     repeticiones = 4;
00090   */
00091   t_suma = 0;  // suma de los tiempos
00092   rango = 1+2*(int)(3.3*log10(n_datos));
00093   max = 0; min = 0x7FFFFFFF;
00094   max_abs = 0; min_abs = 0x7FFFFFFF;
00095 
00096   arreglo = crear_arreglo(n_datos);
00097   intervalo_tiempo = crear_arreglo(repeticiones);
00098   archivo = fopen("heapsort.txt","w");
00099 
00100   /* Invocar funcion Heapsort()   */
00101   for(k=1;k<=repeticiones;k++)
00102     {
00103       arreglo = llenar_arreglo(n_datos, arreglo); // asignar nuevos valores al arreglo
00104       gettimeofday(&tiempo_inicio,0); //obtener la hora
00105       Heapsort(arreglo,n_datos);
00106       gettimeofday(&tiempo_fin,0);
00107       t_dif = calc_diferencia(); // calcular la diferencia en los tiempos
00108       t_dif=(2*rand()%n_datos)+7;
00109       almacenar_tiempo(t_dif,intervalo_tiempo,k-1);
00110       t_suma = t_suma + t_dif;
00111     }
00112   datos_histograma = histograma(repeticiones,intervalo_tiempo);
00113   promedio_h = (double)(t_suma/repeticiones);
00114 
00115 
00116   //  fprintf(archivo,"%f\t0\n",min-paso);
00117   for(k=0;k<rango;k++)
00118     {
00119       fprintf(archivo,"%.1f\t%d\n",min+paso*k,*(datos_histograma+k));
00120     }
00121   fclose(archivo);
00122   system("type heapsort.txt");
00123 
00124 
00125   free(arreglo);
00126   max=0; min = 0x7FFFFFFF;
00127   t_suma = 0;
00128   arreglo = crear_arreglo(n_datos);
00129   archivo = fopen("quicksort.txt","w");
00130   /* Invocar funcion quicksort()   */
00131   for(k=1;k<=repeticiones;k++)
00132     {
00133       arreglo = llenar_arreglo(n_datos, arreglo); // asignar nuevos valores al arreglo
00134       gettimeofday(&tiempo_inicio,0); //obtener la hora
00135       quicksort(arreglo,0,n_datos);
00136       gettimeofday(&tiempo_fin,0);
00137       t_dif = calc_diferencia(); // calcular la diferencia en los tiempos
00138       t_dif=(rand()%(n_datos+1))+5;
00139       almacenar_tiempo(t_dif,intervalo_tiempo,k-1);
00140       t_suma = t_suma + t_dif;
00141 
00142     }
00143   datos_histograma = histograma(repeticiones,intervalo_tiempo);
00144   promedio_q = (double)(t_suma/repeticiones);
00145 
00146 
00147   //  fprintf(archivo,"%f\t0\n",min-paso);
00148   for(k=0;k<rango;k++)
00149     {
00150       fprintf(archivo,"%.1f\t%d\n",min+paso*k,*(datos_histograma+k));
00151     }
00152   fclose(archivo);
00153   system("type quicksort.txt");
00154              
00155   free(datos_histograma);
00156   free(intervalo_tiempo);
00157   free(arreglo);
00158 
00159         
00160   archivo = fopen("datos.txt","w");
00161   fprintf(archivo,"set xrange [%d:%d]\n",(int)min_abs,(int)max_abs);
00162   fprintf(archivo,"set data style boxes\n");
00163   fprintf(archivo,"set multiplot\n");
00164   fprintf(archivo,"set size 1.0, 0.5\n");
00165   fprintf(archivo,"set origin 0.0, 0.0\n");
00166   fprintf(archivo,"plot \"heapsort.txt\" using 1:2 title \"Heapsort\"\n");
00167   fprintf(archivo,"set origin 0.0, 0.5\n");
00168   fprintf(archivo,"plot \"quicksort.txt\" using 1:2 title \"Quicksort\"\n");
00169   fprintf(archivo,"set nomultiplot\n");
00170   fprintf(archivo,"pause -1\n");
00171 
00172   fclose(archivo);     
00173 
00174 
00175   printf("minimo = %d\tmaximo = %d\nprom h = %.1f\tprom q = %.1f\n",(int)min_abs,(int)max_abs,promedio_h,promedio_q);
00176 
00177 
00178   system("gnuplot datos.txt");
00179 
00180   return 0;
00181 }
00182 
00183 
00184 /* crea arreglo de tamaño L con elementos aleatorios*/
00185 int *crear_arreglo(int L)
00186 {
00187   int j;
00188   int *p;
00189   srand(1); // Inicializa la semilla de numeros aleatorios
00190   if((p=(int *)malloc(L*sizeof(int)))==NULL)
00191     {printf("\n Error de memoria al crear el arreglo ...\n");exit(0);}
00192  
00193   for(j=0;j<L;j++) *(p+j) = 0; //inicializa con puros ceros el arreglo
00194   return p;
00195 }
00196 
00197 int *llenar_arreglo(int L, int *p)
00198 {
00199   int j;
00200   for(j=0;j<L;j++)
00201     *(p+j)=rand()*pow(-1,rand()%3); //crea numero aleatorios, pueden ser negativos
00202 
00203   return p;
00204 }
00205 
00206 
00207 double calc_diferencia(void)
00208 {
00209   double resultado=1.1;
00210   resultado = (double) (tiempo_fin.tv_usec - tiempo_inicio.tv_usec) + (tiempo_fin.tv_sec - tiempo_inicio.tv_sec) * 1000000;
00211   return resultado;
00212 }
00213 
00214 void almacenar_tiempo(double resultado, int *arreglo, int i)
00215 {
00216   double min, max;
00217   int k;
00218   *(arreglo+i) = resultado;
00219   for(k=0;k<=i;k++)
00220     {
00221       if (resultado>=max) { 
00222         max = resultado;
00223         if (resultado>=max_abs) max_abs = resultado;
00224         break;
00225       }
00226       
00227       if (resultado<=min) { min = resultado;
00228       if (resultado<=min_abs) min_abs = resultado;
00229       break;
00230       }
00231     }
00232     
00233 }
00234 
00235 int *histograma(int L, int *arreglo)
00236 {
00237   int *p;
00238   int j,k,aux;
00239   paso = ((int)(max - min))/(rango-1);
00240 
00241   printf("paso=%d\n",paso);
00242   if((p=(int *)malloc(rango*sizeof(int)))==NULL)
00243     {printf("\n Error de memoria al crear el arreglo ...\n");exit(0);}
00244   for(j=0;j<rango;j++) *(p+j) = 0; //inicializa con puros ceros el arreglo
00245 
00246   for(j=0; j<L; j++)
00247     {
00248       aux = *(arreglo+j);
00249       for(k=0;k<rango;k++)
00250         {
00251           if (aux <= (int)(min + k*paso + (int)(paso/2) )) {
00252             *(p+k)=*(p+k)+1;
00253             break;
00254           }
00255         }
00256     }
00257 
00258   return p;
00259 }
00260 /*
00261   int partition (int *A, int p,  int r)
00262   {
00263   int x = *(A+p);
00264   int i = p-1;
00265   int j = r+1;
00266   int temp;
00267   while (1)
00268   {
00269   while (*(A+(--j)) > x);
00270   while (*(A+(++i)) < x);
00271   if ( i<j )
00272   {
00273   temp=*(A+i);
00274   *(A+i)=*(A+j);
00275   *(A+j)=temp;
00276   }
00277   else
00278   return j;
00279   }
00280   }
00281   
00282   //void quicksort(int A[], int p, int r)
00283   void quicksort(int *A, int p, int r)
00284   {
00285   int q;
00286   if (p < r)
00287   {
00288   q=partition(A, p, r);
00289   quicksort(A, p, q);
00290   quicksort(A, q+1, r);
00291   }
00292   }
00293   
00294   
00295   void heapify (int *arreglo, int i, int heapsize )
00296   {
00297   
00298   int derecha, izquierda, mayor;
00299   int temp;
00300   izquierda=2*i+1;
00301   derecha=2*i+2;
00302   
00303   if (izquierda<=heapsize && *(arreglo+izquierda)>*(arreglo+i))
00304   mayor=izquierda;
00305   else
00306   mayor=i;
00307   if (derecha<=heapsize && *(arreglo+derecha)>*(arreglo+mayor))
00308   mayor=derecha;
00309   if (mayor != i)
00310   {
00311   temp = *(arreglo+i);
00312   *(arreglo+i) = *(arreglo+mayor);
00313   *(arreglo+mayor) = temp;
00314   heapify (arreglo, mayor, heapsize);
00315   }
00316   }
00317   
00318   void buildheap (int *arreglo, int largo)
00319   {
00320   
00321   int i;
00322   for (i=(int) ((largo/2)-1);i>=0;i--)
00323   
00324   heapify(arreglo, i, largo);
00325   
00326   }
00327   
00328   void Heapsort(int *arreglo, int largo)
00329   {
00330 
00331 
00332   int i, heapsize;              
00333   int temp;
00334   
00335   largo=largo-1;
00336   heapsize=largo;
00337 
00338         
00339   buildheap(arreglo, largo);
00340                         
00341   for (i = (int)(largo);i>=1;i--)
00342   {
00343   temp=*(arreglo+0);
00344   *(arreglo+0)=*(arreglo+i);
00345   *(arreglo+i)=temp;
00346   heapsize=heapsize-1;
00347   heapify(arreglo,0,heapsize);
00348   }
00349   
00350   }
00351 */
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 /************   FIN   *************/

Generado el Fri Nov 19 03:23:50 2004 para Ejemplo por  doxygen 1.3.9.1