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;
00056 int *arreglo;
00057 int *intervalo_tiempo;
00058 int *datos_histograma;
00059 char *valida[2];
00060 double t_dif;
00061 double t_suma, promedio_q, promedio_h;
00062
00063
00064
00065 if (argc !=3) {
00066 printf("Uso: %s [Numero Repeticiones] [Numero de Datos]\n",argv[0]);
00067 exit(1);
00068 }
00069
00070
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;
00087
00088
00089
00090
00091 t_suma = 0;
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
00101 for(k=1;k<=repeticiones;k++)
00102 {
00103 arreglo = llenar_arreglo(n_datos, arreglo);
00104 gettimeofday(&tiempo_inicio,0);
00105 Heapsort(arreglo,n_datos);
00106 gettimeofday(&tiempo_fin,0);
00107 t_dif = calc_diferencia();
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
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
00131 for(k=1;k<=repeticiones;k++)
00132 {
00133 arreglo = llenar_arreglo(n_datos, arreglo);
00134 gettimeofday(&tiempo_inicio,0);
00135 quicksort(arreglo,0,n_datos);
00136 gettimeofday(&tiempo_fin,0);
00137 t_dif = calc_diferencia();
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
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
00185 int *crear_arreglo(int L)
00186 {
00187 int j;
00188 int *p;
00189 srand(1);
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;
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);
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;
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
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360