1 program Comparacion_De_Algoritmos_De_Ordenamiento;
\r
8 RETARDO = 50; { NUMERO DEFINITIVO: 50? }
\r
12 APELLIDO = string[MAX_APE];
\r
13 DOCUMENTO = longint;
\r
24 TABLA = array[1..1000] of PERSONA;
\r
25 TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
\r
26 TIPO_VOCAL = ( TV_AEIOU, TV_EI );
\r
27 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
29 (*********************************************************)
\r
31 procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
\r
39 writeln( ar, datos[i].ap );
\r
40 writeln( ar, datos[i].dni );
\r
45 (*********************************************************)
\r
47 procedure Retardar( centenas: longint );
\r
53 for i:= 1 to centenas * 100 do ;
\r
56 (*********************************************************)
\r
57 (*********************************************************)
\r
59 procedure MenuEvaluar( var datos: TABLA; var arch: text );
\r
62 ORDEN = ( CRECIENTE, DECRECIENTE );
\r
69 bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;
\r
71 (*********************************************************)
\r
73 procedure CrearInforme( ord: ORDEN );
\r
75 (*********************************************************)
\r
77 procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );
\r
81 writeln( info, metodo, ':' );
\r
82 writeln( info, ' Comparaciones: ', sort.Comp: 1 );
\r
83 writeln( info, ' Intercambios: ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );
\r
84 writeln( info, ' Tiempo (seg): ', sort.Tiem / 100: 2: 2 );
\r
85 end; { procedure InfMetodo }
\r
87 (*********************************************************)
\r
89 var { procedure CrearInforme }
\r
93 assign( info, 'INFORME.TXT' );
\r
96 if ord = DECRECIENTE then
\r
98 writeln( info, 'INFORME: Orden Decreciente.' );
\r
99 writeln( info, '======= ~~~~~ ~~~~~~~~~~~' );
\r
103 writeln( info, 'INFORME: Orden Creciente.' );
\r
104 writeln( info, '======= ~~~~~ ~~~~~~~~~' );
\r
107 InfMetodo( info, 'Bubble Sort:', bs );
\r
108 InfMetodo( info, 'Bubble Sort Mejorado:', bsm );
\r
109 InfMetodo( info, 'Shake Sort:', shs );
\r
110 InfMetodo( info, 'Ripple Sort:', rs );
\r
111 InfMetodo( info, 'Selection Sort:', ss );
\r
112 InfMetodo( info, 'Insertion Sort:', is );
\r
113 InfMetodo( info, 'Shell''s Sort:', sls );
\r
114 InfMetodo( info, 'Shell''s Sort Mejorado:', slsm );
\r
115 InfMetodo( info, 'Quick Sort:', qs );
\r
118 writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );
\r
119 writeln( info, '==== asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );
\r
120 writeln( info, ' manera, un intercambio equivales a 3 asignaciones.' );
\r
122 end; { procedure CrearInforme }
\r
124 (*********************************************************)
\r
126 procedure NoExisteArch;
\r
131 textcolor( LightMagenta + Blink );
\r
132 writeln( 'ERROR: No existe el archivo a evaluar!' );
\r
133 textcolor( LightGray );
\r
135 writeln( ' Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
\r
137 end; { procedure NoExisteArch }
\r
139 (*********************************************************)
\r
141 function ExisteArchivo( nombre: String ): boolean;
\r
142 { funcion extrido de la ayuda del pascal }
\r
148 Assign( arch, nombre );
\r
149 FileMode := 0; { Solo lectura }
\r
153 ExisteArchivo := (IOResult = 0) and (nombre <> '');
\r
154 end; { function ExisteArchivo }
\r
156 (*********************************************************)
\r
158 procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
\r
165 for i:= 1 to tam do
\r
167 readln( ar, datos[i].ap );
\r
168 readln( ar, datos[i].dni );
\r
169 readln( ar, void );
\r
171 end; { procedure CargarTabla }
\r
173 (*********************************************************)
\r
175 procedure Intercambiar( var a, b: PERSONA; var int: longint );
\r
182 Retardar( RETARDO );
\r
185 Retardar( RETARDO );
\r
188 Retardar( RETARDO );
\r
190 end; { procedure Intercambiar }
\r
192 (*********************************************************)
\r
194 procedure GetHora( var hor: HORA );
\r
200 gettime( h, m, s, c );
\r
205 end; { procedure GetHora }
\r
207 (*********************************************************)
\r
209 function GetTiempo( h1, h2: HORA ): longint;
\r
216 if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
\r
218 if h1.h < h2.h then
\r
225 else if h1.m <> h2.m then
\r
227 if h1.m < h2.m then
\r
234 else if h1.s <> h2.s then
\r
236 if h1.s < h2.s then
\r
243 else if h1.c <> h2.c then
\r
244 if h1.c < h2.c then
\r
250 t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60 + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
\r
252 end; { function GetTiempo }
\r
254 (*********************************************************)
\r
256 procedure EvaluarCre( var datos: TABLA; var arch: text );
\r
258 (*********************************************************)
\r
260 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
271 CargarTabla( arch, datos, 1000 );
\r
273 for i := tam - 1 downto 1 do
\r
275 for j := tam - 1 downto 1 do
\r
277 m.Comp := m.Comp + 1;
\r
278 Retardar( RETARDO );
\r
279 if datos[j].ap > datos[j+1].ap then
\r
280 Intercambiar( datos[j], datos[j+1], m.Int);
\r
284 m.Tiem := GetTiempo( h1, h2 );
\r
285 end; { procedure BubbleSort }
\r
287 (*********************************************************)
\r
289 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
302 CargarTabla( arch, datos, 1000 );
\r
308 for i := tam - 1 downto n do
\r
310 m.Comp := m.Comp + 1;
\r
311 Retardar( RETARDO );
\r
312 if datos[i].ap > datos[i+1].ap then
\r
314 Intercambiar( datos[i], datos[i+1], m.Int);
\r
321 m.Tiem := GetTiempo( h1, h2 );
\r
322 end; { procedure BubbleSortMej }
\r
324 (*********************************************************)
\r
326 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
329 i, d, j, tmp: integer;
\r
336 CargarTabla( arch, datos, 1000 );
\r
342 for j := d downto i do
\r
344 m.Comp := m.Comp + 1;
\r
345 Retardar( RETARDO );
\r
346 if datos[j].ap < datos[j-1].ap then
\r
348 Intercambiar( datos[j], datos[j-1], m.Int );
\r
355 m.Comp := m.Comp + 1;
\r
356 Retardar( RETARDO );
\r
357 if datos[j].ap < datos[j-1].ap then
\r
359 Intercambiar( datos[j], datos[j-1], m.Int );
\r
366 m.Tiem := GetTiempo( h1, h2 );
\r
367 end; { procedure ShakeSort }
\r
369 (*********************************************************)
\r
371 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
381 CargarTabla( arch, datos, 1000 );
\r
383 for i := 1 to tam do
\r
385 for j := i + 1 to tam do
\r
387 m.Comp := m.Comp + 1;
\r
388 Retardar( RETARDO );
\r
389 if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
\r
393 m.Tiem := GetTiempo( h1, h2 );
\r
394 end; { procedure RippleSort }
\r
396 (*********************************************************)
\r
398 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
400 i, sel, n: integer;
\r
409 CargarTabla( arch, datos, 1000 );
\r
411 for n := 1 to tam - 1 do
\r
415 for i := n + 1 to tam do
\r
417 m.Comp := m.Comp + 1;
\r
418 Retardar( RETARDO );
\r
419 if datos[sel].ap > datos[i].ap then
\r
425 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
\r
428 m.Tiem := GetTiempo( h1, h2 );
\r
429 end; { procedure SelectionSort }
\r
431 (*********************************************************)
\r
433 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
445 CargarTabla( arch, datos, 1000 );
\r
447 for i := 2 to tam do
\r
452 while ( j >= 1 ) and ( not terminar ) do
\r
454 m.Comp := m.Comp + 1;
\r
455 Retardar( RETARDO );
\r
456 if ( tmp.ap < datos[j].ap ) then
\r
458 m.Int := m.Int + 1;
\r
459 Retardar( RETARDO );
\r
460 datos[j+1] := datos[j];
\r
463 else terminar := true;
\r
465 m.Int := m.Int + 1;
\r
466 Retardar( RETARDO );
\r
470 m.Tiem := GetTiempo( h1, h2 );
\r
471 end; { procedure InsertionSort }
\r
473 (*********************************************************)
\r
475 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
478 hueco, i, j: integer;
\r
486 CargarTabla( arch, datos, 1000 );
\r
491 hueco := hueco div 2;
\r
496 for i := 1 to tam - hueco do
\r
499 m.Comp := m.Comp + 1;
\r
500 Retardar( RETARDO );
\r
501 if ( datos[i].ap > datos[j].ap ) then
\r
503 Intercambiar( datos[i], datos[j], m.Int );
\r
510 m.Tiem := GetTiempo( h1, h2 );
\r
511 end; { procedure ShellSort }
\r
513 (*********************************************************)
\r
515 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
517 (*********************************************************)
\r
519 procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );
\r
526 Retardar( RETARDO );
\r
527 if ( datos[i].ap > datos[j].ap ) then
\r
529 Intercambiar( datos[i], datos[j], int );
\r
530 if (i - hueco) > 0 then
\r
531 Shell( datos, hueco, i - hueco, comp, int );
\r
533 end; { procedure Shell }
\r
535 (*********************************************************)
\r
537 var { procedure ShellSortMej }
\r
539 hueco, i, j: integer;
\r
546 CargarTabla( arch, datos, 1000 );
\r
551 hueco := hueco div 2;
\r
552 for i := 1 to tam - hueco do
\r
555 m.Comp := m.Comp + 1;
\r
556 Retardar( RETARDO );
\r
557 if ( datos[i].ap > datos[j].ap ) then
\r
559 Intercambiar( datos[i], datos[j], m.Int );
\r
560 if (i - hueco) > 0 then
\r
561 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
\r
566 m.Tiem := GetTiempo( h1, h2 );
\r
567 end; { procedure ShellSortMej }
\r
569 (*********************************************************)
\r
571 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
573 (*********************************************************)
\r
575 procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );
\r
583 sel := datos[( min + max ) div 2];
\r
588 Retardar( RETARDO );
\r
590 while datos[i].ap < sel.ap do
\r
594 Retardar( RETARDO );
\r
600 Retardar( RETARDO );
\r
602 while datos[j].ap > sel.ap do
\r
606 Retardar( RETARDO );
\r
613 if i < j then Intercambiar( datos[i], datos[j], int );
\r
618 if min < j then QSort( datos, min, j, comp, int);
\r
619 if i < max then QSort( datos, i, max, comp, int);
\r
620 end; { procedure QSort }
\r
622 (*********************************************************)
\r
627 begin { procedure QuickSort }
\r
632 CargarTabla( arch, datos, 1000 );
\r
634 QSort( datos, 1, 1000, m.Comp, m.Int );
\r
636 m.Tiem := GetTiempo( h1, h2 );
\r
638 CargarArchivo( datos, arch, 1000 );
\r
640 end; { procedure QuickSort }
\r
642 (*********************************************************)
\r
644 begin { procedure EvaluarCre }
\r
645 if ExisteArchivo( 'DATOS.TXT' ) then
\r
647 BubbleSort( arch, datos, 1000, bs );
\r
648 BubbleSortMej( arch, datos, 1000, bsm );
\r
649 ShakeSort( arch, datos, 1000, shs );
\r
650 RippleSort( arch, datos, 1000, rs );
\r
651 SelectionSort( arch, datos, 1000, ss );
\r
652 InsertionSort( arch, datos, 1000, is );
\r
653 ShellSort( arch, datos, 1000, sls );
\r
654 ShellSortMej( arch, datos, 1000, slsm );
\r
655 QuickSort( arch, datos, 1000, qs );
\r
656 CrearInforme( CRECIENTE );
\r
660 end; { procedure EvaluarCre }
\r
662 (*********************************************************)
\r
664 procedure EvaluarDec( var datos: TABLA; var arch: text );
\r
666 (*********************************************************)
\r
668 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
679 CargarTabla( arch, datos, 1000 );
\r
681 for i := tam - 1 downto 1 do
\r
683 for j := tam - 1 downto 1 do
\r
685 m.Comp := m.Comp + 1;
\r
686 Retardar( RETARDO );
\r
687 if datos[j].ap < datos[j+1].ap then
\r
688 Intercambiar( datos[j], datos[j+1], m.Int);
\r
692 m.Tiem := GetTiempo( h1, h2 );
\r
693 end; { procedure BubbleSort }
\r
695 (*********************************************************)
\r
697 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
710 CargarTabla( arch, datos, 1000 );
\r
716 for i := tam - 1 downto n do
\r
718 m.Comp := m.Comp + 1;
\r
719 Retardar( RETARDO );
\r
720 if datos[i].ap < datos[i+1].ap then
\r
722 Intercambiar( datos[i], datos[i+1], m.Int);
\r
729 m.Tiem := GetTiempo( h1, h2 );
\r
730 end; { procedure BubbleSortMej }
\r
732 (*********************************************************)
\r
734 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
737 i, d, j, tmp: integer;
\r
744 CargarTabla( arch, datos, 1000 );
\r
750 for j := d downto i do
\r
752 m.Comp := m.Comp + 1;
\r
753 Retardar( RETARDO );
\r
754 if datos[j].ap > datos[j-1].ap then
\r
756 Intercambiar( datos[j], datos[j-1], m.Int );
\r
763 m.Comp := m.Comp + 1;
\r
764 Retardar( RETARDO );
\r
765 if datos[j].ap > datos[j-1].ap then
\r
767 Intercambiar( datos[j], datos[j-1], m.Int );
\r
774 m.Tiem := GetTiempo( h1, h2 );
\r
775 end; { procedure ShakeSort }
\r
777 (*********************************************************)
\r
779 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
789 CargarTabla( arch, datos, 1000 );
\r
791 for i := 1 to tam do
\r
793 for j := i + 1 to tam do
\r
795 m.Comp := m.Comp + 1;
\r
796 Retardar( RETARDO );
\r
797 if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
\r
801 m.Tiem := GetTiempo( h1, h2 );
\r
802 end; { procedure RippleSort }
\r
804 (*********************************************************)
\r
806 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
808 i, sel, n: integer;
\r
817 CargarTabla( arch, datos, 1000 );
\r
819 for n := 1 to tam - 1 do
\r
823 for i := n + 1 to tam do
\r
825 m.Comp := m.Comp + 1;
\r
826 Retardar( RETARDO );
\r
827 if datos[sel].ap < datos[i].ap then
\r
833 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
\r
836 m.Tiem := GetTiempo( h1, h2 );
\r
837 end; { procedure SelectionSort }
\r
839 (*********************************************************)
\r
841 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
853 CargarTabla( arch, datos, 1000 );
\r
855 for i := 2 to tam do
\r
860 while ( j >= 1 ) and ( not terminar ) do
\r
862 m.Comp := m.Comp + 1;
\r
863 Retardar( RETARDO );
\r
864 if ( tmp.ap > datos[j].ap ) then
\r
866 m.Int := m.Int + 1;
\r
867 Retardar( RETARDO );
\r
868 datos[j+1] := datos[j];
\r
871 else terminar := true;
\r
873 m.Int := m.Int + 1;
\r
874 Retardar( RETARDO );
\r
878 m.Tiem := GetTiempo( h1, h2 );
\r
879 end; { procedure InsertionSort }
\r
881 (*********************************************************)
\r
883 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
886 hueco, i, j: integer;
\r
894 CargarTabla( arch, datos, 1000 );
\r
899 hueco := hueco div 2;
\r
904 for i := 1 to tam - hueco do
\r
907 m.Comp := m.Comp + 1;
\r
908 Retardar( RETARDO );
\r
909 if ( datos[i].ap < datos[j].ap ) then
\r
911 Intercambiar( datos[i], datos[j], m.Int );
\r
918 m.Tiem := GetTiempo( h1, h2 );
\r
919 end; { procedure ShellSort }
\r
921 (*********************************************************)
\r
923 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
925 (*********************************************************)
\r
927 procedure Shell( var datos: TABLA; hueco, i: integer;
\r
928 var comp: longint; var int: longint );
\r
935 Retardar( RETARDO );
\r
936 if ( datos[i].ap < datos[j].ap ) then
\r
938 Intercambiar( datos[i], datos[j], int );
\r
939 if (i - hueco) > 0 then
\r
940 Shell( datos, hueco, i - hueco, comp, int );
\r
942 end; { procedure Shell }
\r
944 (*********************************************************)
\r
946 var { procedure ShellSortMej }
\r
948 hueco, i, j: integer;
\r
955 CargarTabla( arch, datos, 1000 );
\r
960 hueco := hueco div 2;
\r
961 for i := 1 to tam - hueco do
\r
964 m.Comp := m.Comp + 1;
\r
965 Retardar( RETARDO );
\r
966 if ( datos[i].ap < datos[j].ap ) then
\r
968 Intercambiar( datos[i], datos[j], m.Int );
\r
969 if (i - hueco) > 0 then
\r
970 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
\r
975 m.Tiem := GetTiempo( h1, h2 );
\r
976 end; { procedure ShellSortMej }
\r
978 (*********************************************************)
\r
980 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
982 procedure QSort( var datos: TABLA; min, max: integer;
\r
983 var comp: longint; var int: longint );
\r
991 sel := datos[( min + max ) div 2];
\r
996 Retardar( RETARDO );
\r
998 while datos[i].ap > sel.ap do
\r
1000 if flag then begin
\r
1002 Retardar( RETARDO );
\r
1004 else flag := true;
\r
1008 Retardar( RETARDO );
\r
1010 while datos[j].ap < sel.ap do
\r
1012 if flag then begin
\r
1014 Retardar( RETARDO );
\r
1016 else flag := true;
\r
1021 if i < j then Intercambiar( datos[i], datos[j], int );
\r
1026 if min < j then QSort( datos, min, j, comp, int);
\r
1027 if i < max then QSort( datos, i, max, comp, int);
\r
1028 end; { procedure QSort }
\r
1030 (*********************************************************)
\r
1035 begin { procedure QuickSort }
\r
1040 CargarTabla( arch, datos, 1000 );
\r
1042 QSort( datos, 1, 1000, m.Comp, m.Int );
\r
1044 m.Tiem := GetTiempo( h1, h2 );
\r
1045 end; { procedure QuickSort }
\r
1047 (*********************************************************)
\r
1049 begin { procedure EvaluarDec }
\r
1050 if ExisteArchivo( 'DATOS.TXT' ) then
\r
1052 BubbleSort( arch, datos, 1000, bs );
\r
1053 BubbleSortMej( arch, datos, 1000, bsm );
\r
1054 ShakeSort( arch, datos, 1000, shs );
\r
1055 RippleSort( arch, datos, 1000, rs );
\r
1056 SelectionSort( arch, datos, 1000, ss );
\r
1057 InsertionSort( arch, datos, 1000, is );
\r
1058 ShellSort( arch, datos, 1000, sls );
\r
1059 ShellSortMej( arch, datos, 1000, slsm );
\r
1060 QuickSort( arch, datos, 1000, qs );
\r
1061 CrearInforme( DECRECIENTE );
\r
1065 end; { procedure EvaluarDec }
\r
1067 (*********************************************************)
\r
1069 var { procedure MenuEvaluar }
\r
1074 textcolor( Yellow );
\r
1076 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1078 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1079 textcolor( LightCyan );
\r
1081 writeln( ' Evaluar Algoritmos:' );
\r
1082 writeln( ' ------- ----------' );
\r
1083 textcolor( LightGray );
\r
1086 writeln( ' 1.- Ordenando en forma creciente.' );
\r
1087 writeln( ' 2.- Ordenando en forma decreciente.' );
\r
1088 writeln( ' 0.- Men£ Anterior.' );
\r
1090 textcolor( White );
\r
1091 write( ' Ingrese su opci¢n: ' );
\r
1092 textcolor( Yellow );
\r
1094 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
1096 textcolor( White );
\r
1098 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
1099 textcolor( Yellow );
\r
1103 '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
\r
1104 else NoExisteArch;
\r
1105 '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
\r
1106 else NoExisteArch;
\r
1111 (*********************************************************)
\r
1112 (*********************************************************)
\r
1114 procedure MenuGenerar( var arch: text );
\r
1116 (*********************************************************)
\r
1118 function GetRNDApellido( max, min: integer ): APELLIDO;
\r
1120 (*********************************************************)
\r
1122 function GetVocal( tipo: TIPO_VOCAL ): char;
\r
1128 if tipo = TV_AEIOU then valor := random( 16 )
\r
1129 else valor := random( 6 ) + 5;
\r
1131 0..4: GetVocal := 'A';
\r
1132 5..7: GetVocal := 'E';
\r
1133 8..10: GetVocal := 'I';
\r
1134 11..13: GetVocal := 'O';
\r
1135 14..15: GetVocal := 'U';
\r
1137 end; { function GetVocal }
\r
1139 (*********************************************************)
\r
1141 procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
\r
1152 proxl := TL_VOCAL;
\r
1156 vocal := GetVocal( TV_EI );
\r
1158 proxl := TL_CONSO;
\r
1162 vocal := GetVocal( TV_AEIOU );
\r
1164 if random( 40 ) = 0 then proxl := TL_VOCAL
\r
1165 else proxl := TL_CONSO;
\r
1168 end; { procedure GetRNDVocal }
\r
1170 (*********************************************************)
\r
1172 procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
\r
1178 proxl := TL_VOCAL;
\r
1182 I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
\r
1183 I_ESB: case random( 2 ) of
\r
1187 I_ESC: case random( 4 ) of
\r
1193 I_ESL: case random( 6 ) of
\r
1195 1..5: conso := 'L';
\r
1197 I_ESM: case random( 3 ) of
\r
1202 I_ESN: case random( 3 ) of
\r
1207 else case random( 55 ) of
\r
1210 if random( 10 ) = 0 then begin
\r
1212 proxl := TL_CONSO;
\r
1217 if random( 5 ) = 0 then begin
\r
1219 proxl := TL_CONSO;
\r
1222 8..11: conso := 'D';
\r
1225 if random( 10 ) = 0 then begin
\r
1227 proxl := TL_CONSO;
\r
1232 if random( 5 ) = 0 then
\r
1235 if random( 4 ) = 0 then proxl := TL_CONSO;
\r
1238 18..19: conso := 'H';
\r
1239 20..22: conso := 'J';
\r
1240 23..24: conso := 'K';
\r
1243 if random( 15 ) = 0 then
\r
1246 proxl := TL_CONSO;
\r
1251 if random( 5 ) = 0 then
\r
1254 proxl := TL_CONSO;
\r
1259 if random( 5 ) = 0 then
\r
1262 proxl := TL_CONSO;
\r
1265 34..36: conso := 'P';
\r
1272 if random( 3 ) = 0 then
\r
1275 proxl := TL_CONSO;
\r
1278 42..44: conso := 'S';
\r
1281 if random( 10 ) = 0 then
\r
1284 proxl := TL_CONSO;
\r
1287 48..50: conso := 'V';
\r
1292 end; { case random( 55 ) of }
\r
1294 end; { case indic of }
\r
1295 end; { procedure GetRNDConsonante }
\r
1297 (*********************************************************)
\r
1299 var { function GetRNDApellido }
\r
1304 proxl: TIPO_LETRA;
\r
1307 if max > MAX_APE then max := MAX_APE;
\r
1308 tam := random( max + 1 ) + min;
\r
1311 if random( 5 ) = 0 then proxl := TL_VOCAL
\r
1312 else proxl := TL_CONSO;
\r
1313 for i := 1 to tam do
\r
1315 if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
\r
1316 else GetRNDVocal( indic, proxl, aux );
\r
1317 apel := apel + aux;
\r
1319 GetRNDApellido := apel;
\r
1320 end; { function GetRNDApellido }
\r
1322 (*********************************************************)
\r
1324 function GetRNDLetra( min, max: char ): char;
\r
1327 GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
\r
1330 (*********************************************************)
\r
1332 procedure GetOrdApellidos( var ar: text; cant: integer );
\r
1336 letra, letra1: char;
\r
1337 i, j, veces: integer;
\r
1339 ap, ape, apel: APELLIDO;
\r
1343 if cant = 1000 then mil := true;
\r
1344 dni := 10000000 + (random( 15000 ) * 100);
\r
1348 for letra := 'A' to 'Z' do
\r
1351 for letra1 := 'A' to 'Z' do
\r
1355 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
1357 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
1360 else case letra1 of
\r
1361 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
1367 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
1369 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
1372 else case letra1 of
\r
1373 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
1377 ape := ap + letra1;
\r
1378 for j := 1 to veces do
\r
1380 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
1381 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
1382 dni := dni + random( 50000 ) + 1;
\r
1383 writeln( ar, apel );
\r
1384 writeln( ar, dni );
\r
1391 end; { for letra1 := 'A' to 'Z' do }
\r
1395 end; { for letra := 'A' to 'Z' do }
\r
1397 end; { procedure GetOrdApellidos }
\r
1399 (*********************************************************)
\r
1401 procedure GetInvOrdApellidos( var ar: text; cant: integer );
\r
1405 letra, letra1: char;
\r
1406 i, j, veces: integer;
\r
1408 ap, ape, apel: APELLIDO;
\r
1412 if cant = 1000 then mil := true;
\r
1413 dni := 34000000 + (random( 15000 ) * 100);
\r
1417 for letra := 'Z' downto 'A' do
\r
1420 for letra1 := 'Z' downto 'A' do
\r
1424 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
1426 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
1429 else case letra1 of
\r
1430 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
1436 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
1438 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
1441 else case letra1 of
\r
1442 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
1446 ape := ap + letra1;
\r
1447 for j := 1 to veces do
\r
1449 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
1450 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
1451 dni := dni - random( 40000 ) - 1;
\r
1452 writeln( ar, apel );
\r
1453 writeln( ar, dni );
\r
1460 end; { for letra1 := 'A' to 'Z' do }
\r
1464 end; { for letra := 'A' to 'Z' do }
\r
1466 end; { GetInvOrdApellidos }
\r
1469 (*********************************************************)
\r
1471 procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
\r
1479 if reabrir then rewrite( arch );
\r
1480 dni := 10000000 + (random( 15000 ) * 100);
\r
1482 for i := 1 to n do
\r
1484 ap := GetRNDApellido( 8, 4 );
\r
1485 dni := dni + random( 50000 ) + 1;
\r
1486 writeln( arch, ap );
\r
1487 writeln( arch, dni );
\r
1490 if reabrir then close( arch );
\r
1491 end; { procedure GenerarRND }
\r
1493 (*********************************************************)
\r
1495 procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
\r
1498 if reabrir then rewrite( arch );
\r
1499 GetOrdApellidos( arch, n );
\r
1500 if reabrir then close( arch );
\r
1503 (*********************************************************)
\r
1505 procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
\r
1508 if reabrir then rewrite( arch );
\r
1509 GetInvOrdApellidos( arch, n );
\r
1510 if reabrir then close( arch );
\r
1513 (*********************************************************)
\r
1515 procedure Generar90Ord( var arch: text );
\r
1519 GenerarOrd( arch, 900, false );
\r
1520 GenerarRND( arch, 100, false );
\r
1524 (*********************************************************)
\r
1526 procedure Generar90OrdDec( var arch: text );
\r
1530 GenerarOrdDec( arch, 900, false );
\r
1531 GenerarRND( arch, 100, false );
\r
1535 (*********************************************************)
\r
1537 var { procedure MenuGenerar }
\r
1542 textcolor( Yellow );
\r
1544 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1546 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1547 textcolor( LightCyan );
\r
1549 writeln( ' Generar Archivo (''DATOS.TXT''):' );
\r
1550 writeln( ' ------- ------- -------------' );
\r
1551 textcolor( LightGray );
\r
1554 writeln( ' 1.- Con datos desordenados.' );
\r
1555 writeln( ' 2.- Con datos en orden creciente (APELLIDO, DNI).' );
\r
1556 writeln( ' 3.- Con datos en orden decreciente (APELLIDO, DNI).' );
\r
1557 writeln( ' 4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
\r
1558 writeln( ' 5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
\r
1559 writeln( ' 0.- Men£ Anterior.' );
\r
1561 textcolor( White );
\r
1562 write( ' Ingrese su opci¢n: ' );
\r
1563 textcolor( Yellow );
\r
1565 while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
\r
1567 textcolor( White );
\r
1569 write( ' Ingrese su opci¢n (1 a 5 o 0): ' );
\r
1570 textcolor( Yellow );
\r
1574 '1': GenerarRND( arch, 1000, true );
\r
1575 '2': GenerarOrd( arch, 1000, true );
\r
1576 '3': GenerarOrdDec( arch, 1000, true );
\r
1577 '4': Generar90Ord( arch );
\r
1578 '5': Generar90OrdDec( arch );
\r
1581 end; { procedure MenuGenerar }
\r
1583 (*********************************************************)
\r
1585 procedure PantallaSalida;
\r
1592 textcolor( white );
\r
1593 writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );
\r
1595 writeln( ' Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
\r
1596 writeln( ' Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
\r
1598 textcolor( LightMagenta );
\r
1599 write( ' lluca@cnba.uba.ar' );
\r
1602 textcolor( LightMagenta );
\r
1603 writeln( 'lluca@geocities.com' );
\r
1606 writeln( ' (c) 1999 - Todos los derechos reservados.' );
\r
1610 (*********************************************************)
\r
1620 assign( arch, 'DATOS.TXT' );
\r
1622 textbackground( Blue );
\r
1624 while not salir do
\r
1627 textcolor( Yellow );
\r
1629 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1631 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1633 textcolor( LightCyan );
\r
1634 writeln( ' Men£ Principal:' );
\r
1635 writeln( ' ---- ---------' );
\r
1636 textcolor( LightGray );
\r
1639 writeln( ' 1.- Generar Archivo (''DATOS.TXT'').' );
\r
1640 writeln( ' 2.- Evaluar Algoritmos.' );
\r
1641 writeln( ' 0.- Salir.' );
\r
1643 textcolor( White );
\r
1644 write( ' Ingrese su opci¢n: ' );
\r
1645 textcolor( Yellow );
\r
1647 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
1649 textcolor( White );
\r
1651 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
1652 textcolor( Yellow );
\r
1656 '1': MenuGenerar( arch );
\r
1657 '2': MenuEvaluar( datos, arch );
\r
1658 '0': salir := true;
\r