1 program Comparacion_De_Algoritmos_De_Ordenamiento;
\r
10 APELLIDO = string[MAX_APE];
\r
11 DOCUMENTO = longint;
\r
22 TABLA = array[1..1000] of PERSONA;
\r
23 TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
\r
24 TIPO_VOCAL = ( TV_AEIOU, TV_EI );
\r
25 INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
\r
27 (*********************************************************)
\r
29 procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
\r
37 writeln( ar, datos[i].ap );
\r
38 writeln( ar, datos[i].dni );
\r
43 (*********************************************************)
\r
44 (*********************************************************)
\r
46 procedure MenuEvaluar( var datos: TABLA; var arch: text );
\r
48 (*********************************************************)
\r
50 procedure NoExisteArch;
\r
55 textcolor( LightMagenta + Blink );
\r
56 writeln( 'ERROR: No existe el archivo a evaluar!' );
\r
57 textcolor( LightGray );
\r
59 writeln( ' Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
\r
61 end; { procedure NoExisteArch }
\r
63 (*********************************************************)
\r
65 function ExisteArchivo( nombre: String ): boolean;
\r
66 { funcion extrido de la ayuda del pascal }
\r
72 Assign( arch, nombre );
\r
73 FileMode := 0; { Solo lectura }
\r
77 ExisteArchivo := (IOResult = 0) and (nombre <> '');
\r
78 end; { function ExisteArchivo }
\r
80 (*********************************************************)
\r
82 procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
\r
91 readln( ar, datos[i].ap );
\r
92 readln( ar, datos[i].dni );
\r
95 end; { procedure CargarTabla }
\r
97 (*********************************************************)
\r
99 procedure Intercambiar( var a, b: PERSONA; var int: longint );
\r
110 end; { procedure Intercambiar }
\r
112 (*********************************************************)
\r
114 procedure GetHora( var hor: HORA );
\r
120 gettime( h, m, s, c );
\r
125 end; { procedure GetHora }
\r
127 (*********************************************************)
\r
129 function GetTiempo( h1, h2: HORA ): longint;
\r
136 if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
\r
138 if h1.h < h2.h then
\r
145 else if h1.m <> h2.m then
\r
147 if h1.m < h2.m then
\r
154 else if h1.s <> h2.s then
\r
156 if h1.s < h2.s then
\r
163 else if h1.c <> h2.c then
\r
164 if h1.c < h2.c then
\r
170 t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60 + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
\r
172 end; { function GetTiempo }
\r
174 (*********************************************************)
\r
176 procedure EvaluarCre( var datos: TABLA; var arch: text );
\r
178 (*********************************************************)
\r
180 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer;
\r
181 var comparaciones: longint; var intercambios: longint; var tiempo: longint );
\r
189 comparaciones := 0;
\r
192 CargarTabla( arch, datos, 1000 );
\r
194 for i := tam - 1 downto 1 do
\r
196 for j := tam - 1 downto 1 do
\r
198 comparaciones := comparaciones + 1;
\r
200 if datos[j].ap > datos[j+1].ap then
\r
201 Intercambiar( datos[j], datos[j+1], intercambios);
\r
205 tiempo := GetTiempo( h1, h2 );
\r
206 end; { procedure BubbleSort }
\r
208 (*********************************************************)
\r
210 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer;
\r
211 var comparaciones: longint; var intercambios: longint; var tiempo: longint );
\r
220 comparaciones := 0;
\r
224 CargarTabla( arch, datos, 1000 );
\r
230 for i := tam - 1 downto n do
\r
232 comparaciones := comparaciones + 1;
\r
234 if datos[i].ap > datos[i+1].ap then
\r
236 Intercambiar( datos[i], datos[i+1], intercambios);
\r
243 tiempo := GetTiempo( h1, h2 );
\r
244 end; { procedure BubbleSortMej }
\r
246 (*********************************************************)
\r
248 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer;
\r
249 var comparaciones: longint; var intercambios: longint; var tiempo: longint );
\r
251 i, sel, n: integer;
\r
257 comparaciones := 0;
\r
260 CargarTabla( arch, datos, 1000 );
\r
262 for n := 1 to tam - 1 do
\r
266 for i := n + 1 to tam do
\r
268 comparaciones := comparaciones + 1;
\r
270 if datos[sel].ap > datos[i].ap then
\r
276 if hubosel then Intercambiar( datos[n], datos[sel], intercambios);
\r
279 tiempo := GetTiempo( h1, h2 );
\r
280 end; { procedure SelectionSort }
\r
282 (*********************************************************)
\r
284 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer;
\r
285 var comparaciones: longint; var intercambios: longint; var tiempo: longint );
\r
287 procedure QSort( var datos: TABLA; min, max: integer;
\r
288 var comp: longint; var int: longint );
\r
296 sel := datos[( min + max ) div 2];
\r
303 while datos[i].ap < sel.ap do
\r
315 while datos[j].ap > sel.ap do
\r
326 if i < j then Intercambiar( datos[i], datos[j], int );
\r
331 if min < j then QSort( datos, min, j, comp, int);
\r
332 if i < max then QSort( datos, i, max, comp, int);
\r
333 end; { procedure QSort }
\r
335 (*********************************************************)
\r
340 begin { procedure QuickSort }
\r
342 comparaciones := 0;
\r
345 CargarTabla( arch, datos, 1000 );
\r
347 QSort( datos, 1, 1000, comparaciones, intercambios );
\r
349 tiempo := GetTiempo( h1, h2 );
\r
351 CargarArchivo( datos, arch, 1000 );
\r
353 end; { procedure QuickSort }
\r
355 (*********************************************************)
\r
357 var { procedure EvaluarCre }
\r
358 bsComp, bsInt, bsTiem,
\r
359 bsmComp, bsmInt, bsmTiem,
\r
360 ssComp, ssInt, ssTiem,
\r
361 qsComp, qsInt, qsTiem: longint;
\r
365 assign( info, 'INFORME.TXT' );
\r
366 if ExisteArchivo( 'DATOS.TXT' ) then
\r
368 BubbleSort( arch, datos, 1000, bsComp, bsInt, bsTiem );
\r
369 BubbleSortMej( arch, datos, 1000, bsmComp, bsmInt, bsmTiem );
\r
370 SelectionSort( arch, datos, 1000, ssComp, ssInt, ssTiem );
\r
371 QuickSort( arch, datos, 1000, qsComp, qsInt, qsTiem );
\r
373 writeln( info, 'Bubble Sort:' );
\r
374 writeln( info, ' Comparaciones: ', bsComp: 1 );
\r
375 writeln( info, ' Intercambios: ', bsInt: 1 );
\r
376 writeln( info, ' Tiempo (seg): ', bsTiem / 100: 2: 2 );
\r
378 writeln( info, 'Bubble Sort Mejorado:' );
\r
379 writeln( info, ' Comparaciones: ', bsmComp: 1 );
\r
380 writeln( info, ' Intercambios: ', bsmInt: 1 );
\r
381 writeln( info, ' Tiempo (seg): ', bsmTiem / 100: 2: 2 );
\r
383 writeln( info, 'Selection Sort:' );
\r
384 writeln( info, ' Comparaciones: ', ssComp: 1 );
\r
385 writeln( info, ' Intercambios: ', ssInt: 1 );
\r
386 writeln( info, ' Tiempo (seg): ', ssTiem / 100: 2: 2 );
\r
388 writeln( info, 'Quick Sort:' );
\r
389 writeln( info, ' Comparaciones: ', qsComp: 1 );
\r
390 writeln( info, ' Intercambios: ', qsInt: 1 );
\r
391 writeln( info, ' Tiempo (seg): ', qsTiem / 100: 2: 2 );
\r
397 end; { procedure EvaluarCre }
\r
399 (*********************************************************)
\r
401 procedure EvaluarDec( var datos: TABLA; var arch: text );
\r
406 for nada := 1 to 1000 do
\r
407 writeln( datos[nada].ap, ' ', datos[nada].dni );
\r
411 (*********************************************************)
\r
413 var { procedure MenuEvaluar }
\r
418 textcolor( Yellow );
\r
420 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
422 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
423 textcolor( LightCyan );
\r
425 writeln( ' Evaluar Algoritmos:' );
\r
426 writeln( ' ------- ----------' );
\r
427 textcolor( LightGray );
\r
430 writeln( ' 1.- Ordenando en forma creciente.' );
\r
431 writeln( ' 2.- Ordenando en forma decreciente.' );
\r
432 writeln( ' 0.- Men£ Anterior.' );
\r
434 textcolor( White );
\r
435 write( ' Ingrese su opci¢n: ' );
\r
436 textcolor( Yellow );
\r
438 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
440 textcolor( White );
\r
442 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
443 textcolor( Yellow );
\r
447 '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
\r
449 '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
\r
455 (*********************************************************)
\r
456 (*********************************************************)
\r
458 procedure MenuGenerar( var arch: text );
\r
460 (*********************************************************)
\r
462 function GetRNDApellido( max, min: integer ): APELLIDO;
\r
464 (*********************************************************)
\r
466 function GetVocal( tipo: TIPO_VOCAL ): char;
\r
472 if tipo = TV_AEIOU then valor := random( 16 )
\r
473 else valor := random( 6 ) + 5;
\r
475 0..4: GetVocal := 'A';
\r
476 5..7: GetVocal := 'E';
\r
477 8..10: GetVocal := 'I';
\r
478 11..13: GetVocal := 'O';
\r
479 14..15: GetVocal := 'U';
\r
481 end; { function GetVocal }
\r
483 (*********************************************************)
\r
485 procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
\r
500 vocal := GetVocal( TV_EI );
\r
506 vocal := GetVocal( TV_AEIOU );
\r
508 if random( 40 ) = 0 then proxl := TL_VOCAL
\r
509 else proxl := TL_CONSO;
\r
512 end; { procedure GetRNDVocal }
\r
514 (*********************************************************)
\r
516 procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
\r
526 I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
\r
527 I_ESB: case random( 2 ) of
\r
531 I_ESC: case random( 4 ) of
\r
537 I_ESL: case random( 6 ) of
\r
539 1..5: conso := 'L';
\r
541 I_ESM: case random( 3 ) of
\r
546 I_ESN: case random( 3 ) of
\r
551 else case random( 55 ) of
\r
554 if random( 10 ) = 0 then begin
\r
561 if random( 5 ) = 0 then begin
\r
566 8..11: conso := 'D';
\r
569 if random( 10 ) = 0 then begin
\r
576 if random( 5 ) = 0 then
\r
579 if random( 4 ) = 0 then proxl := TL_CONSO;
\r
582 18..19: conso := 'H';
\r
583 20..22: conso := 'J';
\r
584 23..24: conso := 'K';
\r
587 if random( 15 ) = 0 then
\r
595 if random( 5 ) = 0 then
\r
603 if random( 5 ) = 0 then
\r
609 34..36: conso := 'P';
\r
616 if random( 3 ) = 0 then
\r
622 42..44: conso := 'S';
\r
625 if random( 10 ) = 0 then
\r
631 48..50: conso := 'V';
\r
636 end; { case random( 55 ) of }
\r
638 end; { case indic of }
\r
639 end; { procedure GetRNDConsonante }
\r
641 (*********************************************************)
\r
643 var { function GetRNDApellido }
\r
651 if max > MAX_APE then max := MAX_APE;
\r
652 tam := random( max + 1 ) + min;
\r
655 if random( 5 ) = 0 then proxl := TL_VOCAL
\r
656 else proxl := TL_CONSO;
\r
657 for i := 1 to tam do
\r
659 if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
\r
660 else GetRNDVocal( indic, proxl, aux );
\r
661 apel := apel + aux;
\r
663 GetRNDApellido := apel;
\r
664 end; { function GetRNDApellido }
\r
666 (*********************************************************)
\r
668 function GetRNDLetra( min, max: char ): char;
\r
671 GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
\r
674 (*********************************************************)
\r
676 procedure GetOrdApellidos( var ar: text; cant: integer );
\r
680 letra, letra1: char;
\r
681 i, j, veces: integer;
\r
683 ap, ape, apel: APELLIDO;
\r
687 if cant = 1000 then mil := true;
\r
688 dni := 10000000 + (random( 15000 ) * 100);
\r
692 for letra := 'A' to 'Z' do
\r
695 for letra1 := 'A' to 'Z' do
\r
699 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
701 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
704 else case letra1 of
\r
705 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
711 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
713 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
716 else case letra1 of
\r
717 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
721 ape := ap + letra1;
\r
722 for j := 1 to veces do
\r
724 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
725 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
726 dni := dni + random( 50000 ) + 1;
\r
727 writeln( ar, apel );
\r
728 writeln( ar, dni );
\r
735 end; { for letra1 := 'A' to 'Z' do }
\r
739 end; { for letra := 'A' to 'Z' do }
\r
741 end; { procedure GetOrdApellidos }
\r
743 (*********************************************************)
\r
745 procedure GetInvOrdApellidos( var ar: text; cant: integer );
\r
749 letra, letra1: char;
\r
750 i, j, veces: integer;
\r
752 ap, ape, apel: APELLIDO;
\r
756 if cant = 1000 then mil := true;
\r
757 dni := 34000000 + (random( 15000 ) * 100);
\r
761 for letra := 'Z' downto 'A' do
\r
764 for letra1 := 'Z' downto 'A' do
\r
768 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
770 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
773 else case letra1 of
\r
774 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
780 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
782 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
785 else case letra1 of
\r
786 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
790 ape := ap + letra1;
\r
791 for j := 1 to veces do
\r
793 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
794 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
795 dni := dni - random( 40000 ) - 1;
\r
796 writeln( ar, apel );
\r
797 writeln( ar, dni );
\r
804 end; { for letra1 := 'A' to 'Z' do }
\r
808 end; { for letra := 'A' to 'Z' do }
\r
810 end; { GetInvOrdApellidos }
\r
813 (*********************************************************)
\r
815 procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
\r
823 if reabrir then rewrite( arch );
\r
824 dni := 10000000 + (random( 15000 ) * 100);
\r
828 ap := GetRNDApellido( 8, 4 );
\r
829 dni := dni + random( 50000 ) + 1;
\r
830 writeln( arch, ap );
\r
831 writeln( arch, dni );
\r
834 if reabrir then close( arch );
\r
835 end; { procedure GenerarRND }
\r
837 (*********************************************************)
\r
839 procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
\r
842 if reabrir then rewrite( arch );
\r
843 GetOrdApellidos( arch, n );
\r
844 if reabrir then close( arch );
\r
847 (*********************************************************)
\r
849 procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
\r
852 if reabrir then rewrite( arch );
\r
853 GetInvOrdApellidos( arch, n );
\r
854 if reabrir then close( arch );
\r
857 (*********************************************************)
\r
859 procedure Generar90Ord( var arch: text );
\r
863 GenerarOrd( arch, 900, false );
\r
864 GenerarRND( arch, 100, false );
\r
868 (*********************************************************)
\r
870 procedure Generar90OrdDec( var arch: text );
\r
874 GenerarOrdDec( arch, 900, false );
\r
875 GenerarRND( arch, 100, false );
\r
879 (*********************************************************)
\r
881 var { procedure MenuGenerar }
\r
886 textcolor( Yellow );
\r
888 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
890 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
891 textcolor( LightCyan );
\r
893 writeln( ' Generar Archivo (''DATOS.TXT''):' );
\r
894 writeln( ' ------- ------- -------------' );
\r
895 textcolor( LightGray );
\r
898 writeln( ' 1.- Con datos desordenados.' );
\r
899 writeln( ' 2.- Con datos en orden creciente (APELLIDO, DNI).' );
\r
900 writeln( ' 3.- Con datos en orden decreciente (APELLIDO, DNI).' );
\r
901 writeln( ' 4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
\r
902 writeln( ' 5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
\r
903 writeln( ' 0.- Men£ Anterior.' );
\r
905 textcolor( White );
\r
906 write( ' Ingrese su opci¢n: ' );
\r
907 textcolor( Yellow );
\r
909 while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
\r
911 textcolor( White );
\r
913 write( ' Ingrese su opci¢n (1 a 5 o 0): ' );
\r
914 textcolor( Yellow );
\r
918 '1': GenerarRND( arch, 1000, true );
\r
919 '2': GenerarOrd( arch, 1000, true );
\r
920 '3': GenerarOrdDec( arch, 1000, true );
\r
921 '4': Generar90Ord( arch );
\r
922 '5': Generar90OrdDec( arch );
\r
925 end; { procedure MenuGenerar }
\r
927 (*********************************************************)
\r
929 { procedure MenuPrincipal( var arch: text; var datos: TABLA );}
\r
939 assign( arch, 'DATOS.TXT' );
\r
941 textbackground( Blue );
\r
946 textcolor( Yellow );
\r
948 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
950 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
952 textcolor( LightCyan );
\r
953 writeln( ' Men£ Principal:' );
\r
954 writeln( ' ---- ---------' );
\r
955 textcolor( LightGray );
\r
958 writeln( ' 1.- Generar Archivo (''DATOS.TXT'').' );
\r
959 writeln( ' 2.- Evaluar Algoritmos.' );
\r
960 writeln( ' 0.- Salir.' );
\r
962 textcolor( White );
\r
963 write( ' Ingrese su opci¢n: ' );
\r
964 textcolor( Yellow );
\r
966 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
968 textcolor( White );
\r
970 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
971 textcolor( Yellow );
\r
975 '1': MenuGenerar( arch );
\r
976 '2': MenuEvaluar( datos, arch );
\r
977 '0': salir := true;
\r
984 textcolor( white );
\r
985 writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n 1.1.0 <-o-o-> Luca - Soft' );
\r
987 writeln( ' Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
\r
988 writeln( ' Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
\r
990 textcolor( LightMagenta );
\r
991 write( ' lluca@cnba.uba.ar' );
\r
994 textcolor( LightMagenta );
\r
995 writeln( 'lluca@geocities.com' );
\r
998 writeln( ' (c) 1999 - Todos los derechos reservados.' );
\r