1 program Comparacion_De_Algoritmos_De_Ordenamiento;
12 APELLIDO = string[MAX_APE];
18 TABLA = array[1..1000] of PERSONA;
20 (*********************************************************)
22 procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
30 writeln( ar, datos[i].ap );
31 writeln( ar, datos[i].dni );
34 end; { procedure CargarArchivo }
36 (*********************************************************)
38 procedure Retardar( centenas: longint );
44 for i:= 1 to centenas * 100 do ;
45 end; { procedure Retardar }
47 (*********************************************************)
48 (*********************************************************)
50 procedure MenuEvaluar( var datos: TABLA; var arch: text );
59 ORDEN = ( CRECIENTE, DECRECIENTE );
66 bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;
68 (*********************************************************)
70 procedure CrearInforme( ord: ORDEN );
72 (*********************************************************)
74 procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );
78 writeln( info, metodo, ':' );
79 writeln( info, ' Comparaciones: ', sort.Comp: 1 );
80 writeln( info, ' Intercambios: ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );
81 writeln( info, ' Tiempo (seg): ', sort.Tiem / 100: 2: 2 );
82 end; { procedure InfMetodo }
84 (*********************************************************)
86 var { procedure CrearInforme }
90 assign( info, 'INFORME.TXT' );
93 if ord = DECRECIENTE then
95 writeln( info, 'INFORME: Orden Decreciente.' );
96 writeln( info, '======= ~~~~~ ~~~~~~~~~~~' );
100 writeln( info, 'INFORME: Orden Creciente.' );
101 writeln( info, '======= ~~~~~ ~~~~~~~~~' );
104 InfMetodo( info, 'Bubble Sort', bs );
105 InfMetodo( info, 'Bubble Sort Mejorado', bsm );
106 InfMetodo( info, 'Shake Sort', shs );
107 InfMetodo( info, 'Ripple Sort', rs );
108 InfMetodo( info, 'Selection Sort', ss );
109 InfMetodo( info, 'Insertion Sort', is );
110 InfMetodo( info, 'Shell''s Sort', sls );
111 InfMetodo( info, 'Shell''s Sort Mejorado', slsm );
112 InfMetodo( info, 'Quick Sort', qs );
115 writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );
116 writeln( info, '==== asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );
117 writeln( info, ' manera, un intercambio equivales a 3 asignaciones.' );
119 end; { procedure CrearInforme }
121 (*********************************************************)
123 procedure NoExisteArch;
128 textcolor( LightMagenta + Blink );
129 writeln( 'ERROR: No existe el archivo a evaluar!' );
130 textcolor( LightGray );
132 writeln( ' Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
134 end; { procedure NoExisteArch }
136 (*********************************************************)
138 function ExisteArchivo( nombre: String ): boolean;
140 { funcion extrida de la ayuda del Turbo Pascal 7 }
147 Assign( arch, nombre );
148 FileMode := 0; { Solo lectura }
152 ExisteArchivo := (IOResult = 0) and (nombre <> '');
153 end; { function ExisteArchivo }
155 (*********************************************************)
157 procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
166 readln( ar, datos[i].ap );
167 readln( ar, datos[i].dni );
170 end; { procedure CargarTabla }
172 (*********************************************************)
174 procedure Intercambiar( var a, b: PERSONA; var int: longint );
189 end; { procedure Intercambiar }
191 (*********************************************************)
193 procedure GetHora( var hor: HORA );
199 gettime( h, m, s, c );
204 end; { procedure GetHora }
206 (*********************************************************)
208 function GetTiempo( h1, h2: HORA ): longint;
215 if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
224 else if h1.m <> h2.m then
233 else if h1.s <> h2.s then
242 else if h1.c <> h2.c then
249 t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60 + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
251 end; { function GetTiempo }
253 (*********************************************************)
255 procedure EvaluarCre( var datos: TABLA; var arch: text );
257 (*********************************************************)
259 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
270 CargarTabla( arch, datos, 1000 );
272 for i := tam - 1 downto 1 do
274 for j := tam - 1 downto 1 do
276 m.Comp := m.Comp + 1;
278 if datos[j].ap > datos[j+1].ap then
279 Intercambiar( datos[j], datos[j+1], m.Int);
283 m.Tiem := GetTiempo( h1, h2 );
284 end; { procedure BubbleSort }
286 (*********************************************************)
288 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
301 CargarTabla( arch, datos, 1000 );
307 for i := tam - 1 downto n do
309 m.Comp := m.Comp + 1;
311 if datos[i].ap > datos[i+1].ap then
313 Intercambiar( datos[i], datos[i+1], m.Int);
320 m.Tiem := GetTiempo( h1, h2 );
321 end; { procedure BubbleSortMej }
323 (*********************************************************)
325 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
328 i, d, j, tmp: integer;
335 CargarTabla( arch, datos, 1000 );
341 for j := d downto i do
343 m.Comp := m.Comp + 1;
345 if datos[j].ap < datos[j-1].ap then
347 Intercambiar( datos[j], datos[j-1], m.Int );
354 m.Comp := m.Comp + 1;
356 if datos[j].ap < datos[j-1].ap then
358 Intercambiar( datos[j], datos[j-1], m.Int );
365 m.Tiem := GetTiempo( h1, h2 );
366 end; { procedure ShakeSort }
368 (*********************************************************)
370 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
380 CargarTabla( arch, datos, 1000 );
384 for j := i + 1 to tam do
386 m.Comp := m.Comp + 1;
388 if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
392 m.Tiem := GetTiempo( h1, h2 );
393 end; { procedure RippleSort }
395 (*********************************************************)
397 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
408 CargarTabla( arch, datos, 1000 );
410 for n := 1 to tam - 1 do
414 for i := n + 1 to tam do
416 m.Comp := m.Comp + 1;
418 if datos[sel].ap > datos[i].ap then
424 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
427 m.Tiem := GetTiempo( h1, h2 );
428 end; { procedure SelectionSort }
430 (*********************************************************)
432 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
444 CargarTabla( arch, datos, 1000 );
453 while ( j >= 1 ) and ( not terminar ) do
455 m.Comp := m.Comp + 1;
457 if ( tmp.ap < datos[j].ap ) then
461 datos[j+1] := datos[j];
464 else terminar := true;
471 m.Tiem := GetTiempo( h1, h2 );
472 end; { procedure InsertionSort }
474 (*********************************************************)
476 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
479 hueco, i, j: integer;
487 CargarTabla( arch, datos, 1000 );
492 hueco := hueco div 2;
497 for i := 1 to tam - hueco do
500 m.Comp := m.Comp + 1;
502 if ( datos[i].ap > datos[j].ap ) then
504 Intercambiar( datos[i], datos[j], m.Int );
511 m.Tiem := GetTiempo( h1, h2 );
512 end; { procedure ShellSort }
514 (*********************************************************)
516 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
518 (*********************************************************)
520 procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );
528 if ( datos[i].ap > datos[j].ap ) then
530 Intercambiar( datos[i], datos[j], int );
531 if (i - hueco) > 0 then
532 Shell( datos, hueco, i - hueco, comp, int );
534 end; { procedure Shell }
536 (*********************************************************)
538 var { procedure ShellSortMej }
540 hueco, i, j: integer;
547 CargarTabla( arch, datos, 1000 );
552 hueco := hueco div 2;
553 for i := 1 to tam - hueco do
556 m.Comp := m.Comp + 1;
558 if ( datos[i].ap > datos[j].ap ) then
560 Intercambiar( datos[i], datos[j], m.Int );
561 if (i - hueco) > 0 then
562 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
567 m.Tiem := GetTiempo( h1, h2 );
568 end; { procedure ShellSortMej }
570 (*********************************************************)
572 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
574 (*********************************************************)
576 procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );
584 sel := datos[( min + max ) div 2];
591 while datos[i].ap < sel.ap do
603 while datos[j].ap > sel.ap do
614 if i < j then Intercambiar( datos[i], datos[j], int );
619 if min < j then QSort( datos, min, j, comp, int);
620 if i < max then QSort( datos, i, max, comp, int);
621 end; { procedure QSort }
623 (*********************************************************)
628 begin { procedure QuickSort }
633 CargarTabla( arch, datos, 1000 );
635 QSort( datos, 1, 1000, m.Comp, m.Int );
637 m.Tiem := GetTiempo( h1, h2 );
638 end; { procedure QuickSort }
640 (*********************************************************)
642 begin { procedure EvaluarCre }
643 if ExisteArchivo( 'DATOS.TXT' ) then
645 BubbleSort( arch, datos, 1000, bs );
646 BubbleSortMej( arch, datos, 1000, bsm );
647 ShakeSort( arch, datos, 1000, shs );
648 RippleSort( arch, datos, 1000, rs );
649 SelectionSort( arch, datos, 1000, ss );
650 InsertionSort( arch, datos, 1000, is );
651 ShellSort( arch, datos, 1000, sls );
652 ShellSortMej( arch, datos, 1000, slsm );
653 QuickSort( arch, datos, 1000, qs );
654 CrearInforme( CRECIENTE );
658 end; { procedure EvaluarCre }
660 (*********************************************************)
662 procedure EvaluarDec( var datos: TABLA; var arch: text );
664 (*********************************************************)
666 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
677 CargarTabla( arch, datos, 1000 );
679 for i := tam - 1 downto 1 do
681 for j := tam - 1 downto 1 do
683 m.Comp := m.Comp + 1;
685 if datos[j].ap < datos[j+1].ap then
686 Intercambiar( datos[j], datos[j+1], m.Int);
690 m.Tiem := GetTiempo( h1, h2 );
691 end; { procedure BubbleSort }
693 (*********************************************************)
695 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
708 CargarTabla( arch, datos, 1000 );
714 for i := tam - 1 downto n do
716 m.Comp := m.Comp + 1;
718 if datos[i].ap < datos[i+1].ap then
720 Intercambiar( datos[i], datos[i+1], m.Int);
727 m.Tiem := GetTiempo( h1, h2 );
728 end; { procedure BubbleSortMej }
730 (*********************************************************)
732 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
735 i, d, j, tmp: integer;
742 CargarTabla( arch, datos, 1000 );
748 for j := d downto i do
750 m.Comp := m.Comp + 1;
752 if datos[j].ap > datos[j-1].ap then
754 Intercambiar( datos[j], datos[j-1], m.Int );
761 m.Comp := m.Comp + 1;
763 if datos[j].ap > datos[j-1].ap then
765 Intercambiar( datos[j], datos[j-1], m.Int );
772 m.Tiem := GetTiempo( h1, h2 );
773 end; { procedure ShakeSort }
775 (*********************************************************)
777 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
787 CargarTabla( arch, datos, 1000 );
791 for j := i + 1 to tam do
793 m.Comp := m.Comp + 1;
795 if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
799 m.Tiem := GetTiempo( h1, h2 );
800 end; { procedure RippleSort }
802 (*********************************************************)
804 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
815 CargarTabla( arch, datos, 1000 );
817 for n := 1 to tam - 1 do
821 for i := n + 1 to tam do
823 m.Comp := m.Comp + 1;
825 if datos[sel].ap < datos[i].ap then
831 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
834 m.Tiem := GetTiempo( h1, h2 );
835 end; { procedure SelectionSort }
837 (*********************************************************)
839 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
851 CargarTabla( arch, datos, 1000 );
860 while ( j >= 1 ) and ( not terminar ) do
862 m.Comp := m.Comp + 1;
864 if ( tmp.ap > datos[j].ap ) then
868 datos[j+1] := datos[j];
871 else terminar := true;
878 m.Tiem := GetTiempo( h1, h2 );
879 end; { procedure InsertionSort }
881 (*********************************************************)
883 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
886 hueco, i, j: integer;
894 CargarTabla( arch, datos, 1000 );
899 hueco := hueco div 2;
904 for i := 1 to tam - hueco do
907 m.Comp := m.Comp + 1;
909 if ( datos[i].ap < datos[j].ap ) then
911 Intercambiar( datos[i], datos[j], m.Int );
918 m.Tiem := GetTiempo( h1, h2 );
919 end; { procedure ShellSort }
921 (*********************************************************)
923 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
925 (*********************************************************)
927 procedure Shell( var datos: TABLA; hueco, i: integer;
928 var comp: longint; var int: longint );
936 if ( datos[i].ap < datos[j].ap ) then
938 Intercambiar( datos[i], datos[j], int );
939 if (i - hueco) > 0 then
940 Shell( datos, hueco, i - hueco, comp, int );
942 end; { procedure Shell }
944 (*********************************************************)
946 var { procedure ShellSortMej }
948 hueco, i, j: integer;
955 CargarTabla( arch, datos, 1000 );
960 hueco := hueco div 2;
961 for i := 1 to tam - hueco do
964 m.Comp := m.Comp + 1;
966 if ( datos[i].ap < datos[j].ap ) then
968 Intercambiar( datos[i], datos[j], m.Int );
969 if (i - hueco) > 0 then
970 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
975 m.Tiem := GetTiempo( h1, h2 );
976 end; { procedure ShellSortMej }
978 (*********************************************************)
980 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
982 procedure QSort( var datos: TABLA; min, max: integer;
983 var comp: longint; var int: longint );
991 sel := datos[( min + max ) div 2];
998 while datos[i].ap > sel.ap do
1002 Retardar( RETARDO );
1008 Retardar( RETARDO );
1010 while datos[j].ap < sel.ap do
1014 Retardar( RETARDO );
1021 if i < j then Intercambiar( datos[i], datos[j], int );
1026 if min < j then QSort( datos, min, j, comp, int);
1027 if i < max then QSort( datos, i, max, comp, int);
1028 end; { procedure QSort }
1030 (*********************************************************)
1035 begin { procedure QuickSort }
1040 CargarTabla( arch, datos, 1000 );
1042 QSort( datos, 1, 1000, m.Comp, m.Int );
1044 m.Tiem := GetTiempo( h1, h2 );
1045 end; { procedure QuickSort }
1047 (*********************************************************)
1049 begin { procedure EvaluarDec }
1050 if ExisteArchivo( 'DATOS.TXT' ) then
1052 BubbleSort( arch, datos, 1000, bs );
1053 BubbleSortMej( arch, datos, 1000, bsm );
1054 ShakeSort( arch, datos, 1000, shs );
1055 RippleSort( arch, datos, 1000, rs );
1056 SelectionSort( arch, datos, 1000, ss );
1057 InsertionSort( arch, datos, 1000, is );
1058 ShellSort( arch, datos, 1000, sls );
1059 ShellSortMej( arch, datos, 1000, slsm );
1060 QuickSort( arch, datos, 1000, qs );
1061 CrearInforme( DECRECIENTE );
1065 end; { procedure EvaluarDec }
1067 (*********************************************************)
1069 var { procedure MenuEvaluar }
1074 textcolor( Yellow );
1076 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
1078 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
1079 textcolor( LightCyan );
1081 writeln( ' Evaluar Algoritmos:' );
1082 writeln( ' ------- ----------' );
1083 textcolor( LightGray );
1086 writeln( ' 1.- Ordenando en forma creciente.' );
1087 writeln( ' 2.- Ordenando en forma decreciente.' );
1088 writeln( ' 0.- Men£ Anterior.' );
1091 write( ' Ingrese su opci¢n: ' );
1092 textcolor( Yellow );
1094 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
1098 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
1099 textcolor( Yellow );
1103 '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
1105 '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
1111 (*********************************************************)
1112 (*********************************************************)
1114 procedure MenuGenerar( var arch: text );
1117 TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
1118 TIPO_VOCAL = ( TV_AEIOU, TV_EI );
1119 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 );
1121 (*********************************************************)
1123 function GetRNDApellido( max, min: integer ): APELLIDO;
1125 (*********************************************************)
1127 function GetVocal( tipo: TIPO_VOCAL ): char;
1133 if tipo = TV_AEIOU then valor := random( 16 )
1134 else valor := random( 6 ) + 5;
1136 0..4: GetVocal := 'A';
1137 5..7: GetVocal := 'E';
1138 8..10: GetVocal := 'I';
1139 11..13: GetVocal := 'O';
1140 14..15: GetVocal := 'U';
1142 end; { function GetVocal }
1144 (*********************************************************)
1146 procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
1161 vocal := GetVocal( TV_EI );
1167 vocal := GetVocal( TV_AEIOU );
1169 if random( 40 ) = 0 then proxl := TL_VOCAL
1170 else proxl := TL_CONSO;
1173 end; { procedure GetRNDVocal }
1175 (*********************************************************)
1177 procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
1187 I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
1188 I_ESB: case random( 2 ) of
1192 I_ESC: case random( 4 ) of
1198 I_ESL: case random( 6 ) of
1202 I_ESM: case random( 3 ) of
1207 I_ESN: case random( 3 ) of
1212 else case random( 55 ) of
1215 if random( 10 ) = 0 then begin
1222 if random( 5 ) = 0 then begin
1227 8..11: conso := 'D';
1230 if random( 10 ) = 0 then begin
1237 if random( 5 ) = 0 then
1240 if random( 4 ) = 0 then proxl := TL_CONSO;
1243 18..19: conso := 'H';
1244 20..22: conso := 'J';
1245 23..24: conso := 'K';
1248 if random( 15 ) = 0 then
1256 if random( 5 ) = 0 then
1264 if random( 5 ) = 0 then
1270 34..36: conso := 'P';
1277 if random( 3 ) = 0 then
1283 42..44: conso := 'S';
1286 if random( 10 ) = 0 then
1292 48..50: conso := 'V';
1297 end; { case random( 55 ) of }
1299 end; { case indic of }
1300 end; { procedure GetRNDConsonante }
1302 (*********************************************************)
1304 var { function GetRNDApellido }
1312 if max > MAX_APE then max := MAX_APE;
1313 tam := random( max + 1 ) + min;
1316 if random( 5 ) = 0 then proxl := TL_VOCAL
1317 else proxl := TL_CONSO;
1318 for i := 1 to tam do
1320 if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
1321 else GetRNDVocal( indic, proxl, aux );
1324 GetRNDApellido := apel;
1325 end; { function GetRNDApellido }
1327 (*********************************************************)
1329 function GetRNDLetra( min, max: char ): char;
1332 GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
1335 (*********************************************************)
1337 procedure GetOrdApellidos( var ar: text; cant: integer );
1341 letra, letra1: char;
1342 i, j, veces: integer;
1344 ap, ape, apel: APELLIDO;
1348 if cant = 1000 then mil := true;
1349 dni := 10000000 + (random( 15000 ) * 100);
1353 for letra := 'A' to 'Z' do
1356 for letra1 := 'A' to 'Z' do
1360 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
1362 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
1366 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
1372 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
1374 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
1378 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
1383 for j := 1 to veces do
1385 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
1386 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
1387 dni := dni + random( 50000 ) + 1;
1388 writeln( ar, apel );
1394 end; { for letra1 := 'A' to 'Z' do }
1398 end; { for letra := 'A' to 'Z' do }
1400 end; { procedure GetOrdApellidos }
1402 (*********************************************************)
1404 procedure GetInvOrdApellidos( var ar: text; cant: integer );
1408 letra, letra1: char;
1409 i, j, veces: integer;
1411 ap, ape, apel: APELLIDO;
1415 if cant = 1000 then mil := true;
1416 dni := 34000000 + (random( 15000 ) * 100);
1420 for letra := 'Z' downto 'A' do
1423 for letra1 := 'Z' downto 'A' do
1427 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
1429 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
1433 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
1439 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
1441 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
1445 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
1450 for j := 1 to veces do
1452 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
1453 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
1454 dni := dni - random( 40000 ) - 1;
1455 writeln( ar, apel );
1461 end; { for letra1 := 'A' to 'Z' do }
1465 end; { for letra := 'A' to 'Z' do }
1467 end; { GetInvOrdApellidos }
1470 (*********************************************************)
1472 procedure GenerarRND( var arch: text; n: longint; reabrir: boolean );
1479 if reabrir then rewrite( arch );
1483 ap := GetRNDApellido( 30, 4 );
1484 writeln( arch, ap );
1486 if reabrir then close( arch );
1487 end; { procedure GenerarRND }
1489 (*********************************************************)
1491 procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
1494 if reabrir then rewrite( arch );
1495 GetOrdApellidos( arch, n );
1496 if reabrir then close( arch );
1499 (*********************************************************)
1501 procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
1504 if reabrir then rewrite( arch );
1505 GetInvOrdApellidos( arch, n );
1506 if reabrir then close( arch );
1509 (*********************************************************)
1511 procedure Generar90Ord( var arch: text );
1515 GenerarOrd( arch, 900, false );
1516 GenerarRND( arch, 100, false );
1520 (*********************************************************)
1522 procedure Generar90OrdDec( var arch: text );
1526 GenerarOrdDec( arch, 900, false );
1527 GenerarRND( arch, 100, false );
1531 (*********************************************************)
1533 var { procedure MenuGenerar }
1538 textcolor( Yellow );
1540 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
1542 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
1543 textcolor( LightCyan );
1545 writeln( ' Generar Archivo (''DATOS.TXT''):' );
1546 writeln( ' ------- ------- -------------' );
1547 textcolor( LightGray );
1550 writeln( ' 1.- Con datos desordenados.' );
1551 writeln( ' 2.- Con datos en orden creciente (APELLIDO, DNI).' );
1552 writeln( ' 3.- Con datos en orden decreciente (APELLIDO, DNI).' );
1553 writeln( ' 4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
1554 writeln( ' 5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
1555 writeln( ' 0.- Men£ Anterior.' );
1558 write( ' Ingrese su opci¢n: ' );
1559 textcolor( Yellow );
1561 while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
1565 write( ' Ingrese su opci¢n (1 a 5 o 0): ' );
1566 textcolor( Yellow );
1570 '1': GenerarRND( arch, 1000000, true );
1571 '2': GenerarOrd( arch, 1000, true );
1572 '3': GenerarOrdDec( arch, 1000, true );
1573 '4': Generar90Ord( arch );
1574 '5': Generar90OrdDec( arch );
1577 end; { procedure MenuGenerar }
1579 (*********************************************************)
1581 procedure PantallaSalida;
1589 writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );
1591 writeln( ' Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
1592 writeln( ' Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
1594 textcolor( LightMagenta );
1595 write( ' lluca@cnba.uba.ar' );
1598 textcolor( LightMagenta );
1599 writeln( 'lluca@geocities.com' );
1602 writeln( ' (c) 1999 - Todos los derechos reservados.' );
1606 (*********************************************************)
1616 assign( arch, 'DATOS.TXT' );
1618 textbackground( Blue );
1623 textcolor( Yellow );
1625 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
1627 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
1629 textcolor( LightCyan );
1630 writeln( ' Men£ Principal:' );
1631 writeln( ' ---- ---------' );
1632 textcolor( LightGray );
1635 writeln( ' 1.- Generar Archivo (''DATOS.TXT'').' );
1636 writeln( ' 2.- Evaluar Algoritmos.' );
1637 writeln( ' 0.- Salir.' );
1640 write( ' Ingrese su opci¢n: ' );
1641 textcolor( Yellow );
1643 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
1647 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
1648 textcolor( Yellow );
1652 '1': MenuGenerar( arch );
1653 '2': MenuEvaluar( datos, arch );