program vectores01;
uses crt;
const mini = 1;
maxi = 100;
type vector = array [mini..maxi] of integer;
Procedure despide;
begin
gotoxy(5,22); write('Pulsa una tecla para continuar...');
readkey;
end;
procedure escribe_vector(v:vector;N:byte);
var i : integer;
begin
for i := mini to N do write(v[i]:5);
writeln;
end;
procedure SeleccionDirecta (v : vector; N:byte);
var vuelta,recorrido,
valor_mas_peque,pos_del_mas_peque : integer;
begin
escribe_vector(v,N);
for vuelta := mini to N - 1 do
begin
valor_mas_peque := v[vuelta];
pos_del_mas_peque := vuelta;
for recorrido := vuelta + 1 to N do
if v[recorrido] < valor_mas_peque
then begin
valor_mas_peque := v[recorrido];
pos_del_mas_peque := recorrido;
end;
if vuelta < pos_del_mas_peque
then begin
v[pos_del_mas_peque] := v[vuelta];
v[vuelta] := valor_mas_peque;
end;
escribe_vector(v,N);
end;
despide;
end;
procedure Baraja(v:vector;N:byte);
Var
i, j, index : Integer;
Begin
For i := 1 to N do
Begin
index := v[i];
j := i-1;
While ((j >= 0) AND (v[j] > index)) do
Begin
v[j+1] := v[j];
j := j - 1;
End;
v[j+1] := index;
escribe_vector(v,N);
End;
despide;
end;
procedure Burbuja(v:vector;N:byte);
var
i,j,index:integer;
begin
for i:=1 to N-1 do
for j:=1 to N-i do
begin
if v[i] > v[j+1] then
begin
index:=v[j];
v[j]:=v[j+1];
v[j+1]:=index;
end;
escribe_vector(v,N);
end;
despide;
end;
procedure Switch(v:vector;N:byte);
var i,j,index:integer;
cambiado: boolean;
begin
clrscr;
repeat
cambiado := false;
for i := N downto 2 do
if v[i] < v[j+1] then {esta es la linea que da error}
begin
index:=v[j];
v[j]:=v[j+1];
v[j+1]:=index;
cambiado := true;
end;
until not cambiado;
despide;
end;
procedure Sacudida(v:vector;N:byte);
begin
clrscr;
gotoxy(5,5); write('Este método aún no lo tengo implementado');
despide;
end;
procedure Shell(v:vector;N:byte);
begin
clrscr;
gotoxy(5,5); write('Este método aún no lo tengo implementado');
despide;
end;
procedure presenta(var N:byte);
begin
clrscr;
gotoxy(5,5); write('Este programa nos ordena un vector de N valores');
gotoxy(5,6); write('Primero me rellena aleatoriamente el vector');
gotoxy(5,7); write('Y luego el usuario elige un método de ordenación');
gotoxy(5,8); write('================================================');
gotoxy(5,10); write('Dime cuántos valores quieres que tengamos: ');
readln(N);
despide;
end;
procedure rellena_vector(var v:vector; N:byte);
var i : integer;
begin
randomize;
for i := mini to N do v[i] := random(1000);
end;
function menu(v:vector;N:byte):char;
var c : char;
begin
clrscr;
gotoxy(5,5); write('M E N U D E O R D E N A C I O N');
gotoxy(5,6); write('===================================');
gotoxy(5,8); write('1.- Método selección directa');
gotoxy(5,9); write('2.- Método baraja');
gotoxy(5,10); write('3.- Método burbuja');
gotoxy(5,11); write('4.- Método switch');
gotoxy(5,12); write('5.- Método sacudida');
gotoxy(5,13); write('6.- Método shell');
gotoxy(5,14); write('7.- Salir');
gotoxy(5,17); write('Pulsa el número de tu elección: ');
repeat c := readkey; until c IN ['1'..'7'];
clrscr;
case c of
'1' : SeleccionDirecta(v,N);
'2' : Baraja(v,N);
'3' : Burbuja(v,N);
'4' : Switch(v,N);
'5' : Sacudida(v,N); {Opcional, sólo para sacar un 10}
'6' : Shell(v,N); {Opcional, sólo para sacar un 10}
end;
menu := c;
end;
var v : vector;
N : byte;
BEGIN
presenta(N);
rellena_vector(v,N);
repeat until menu(v,N) = '7';
END.