RE:Busqueda de la mediana
Ok, lo que quiero hacer es buscar la mediana sin ordenar el vector. Tan solo debo poner los menores a la izquierda y mayores a la derecha, pero no debo usar ningun metodo de ordenacion como aparece por la red (ni QuickSort, ni nada de eso). Lo debo hacer como lo explica esta pagina: http://euitio178.ccu.uniovi.es/wiki/index.php/TP:B%C3%BAsqueda_de_la_mediana_-_Divide_y_vencer%C3%A1s
Los datos los leeré desde un fichero de este tipo:
___________
4
156897415
5
46787561
___________
Lo que significa el fichero es que, la primera linea donde aparece solo un numero es la posicion enesima que tengo que hallar, es decir, mirando el primer ejemplo del fichero: buscar qué numero del vector de abajo ocuparía la 4ª posicion si estuviera ordenado (pero sin ordenarlo). Y luego, buscar qué numero del otro vector ocuparía la 5ª posicion si éste estuviera ordenado.
Espero que lo entendáis mejor desde la página que os he proporcionado. Bueno, mi código está fatal pero bueno jejej, por eso os pido ayuda. Yo lo he intentado pero debo tener algun error muy gordo. Y bueno, el código que tengo es este:
(Gracias por la ayuda que me podáis ofrecer)
(*************************************************************************************************************)
program mediana;
uses
crt;
const
OPCIONES_MENU = 2;
MIN = 1;
MAX = 30;
type
Tvect = array [MIN..MAX] of integer;
Taux = array [MIN..MAX] of integer;
var
info : integer;
fich : text;
vect : Tvect;
aux : Taux;
cont, s, p, izda, dcha : integer;
(*************************************************************************************************************)
procedure pivotebis(vect : Tvect; var P : integer; var i : integer; var j : integer; var dcha : integer; var izda : integer);
var
cont1, cont2, x : integer;
begin
cont1 := i - 1;
cont2 := j + 1;
for x := i to j do
begin
if (vect[i] < P) then
begin
aux[cont1] := vect[i];
cont1 := cont1 + 1;
end;
if (vect[i] > P) then
begin
aux[cont2] := vect[i];
cont2 := cont2 -1;
end;
end;
dcha := cont1;
izda := cont2;
writeln();
writeln(' Procediendo a ubicar mayores y menores que el pivote' );
writeln();
writeln('Nnuevo vector: ');
for x := cont1 to cont2 do
begin
write(' ', aux[x]);
end;
writeln();
readln;
readln;
end;
(*************************************************************************************************************)
function mediana(vector : Tvector; i : integer; var j : integer) : integer;
var
med : integer;
begin
med := (i + j) div 2;
if (med < i) then
med := i
else
if (med > i) then
med := i
else
if (med < j) then
med := j
else
if (med > j) then
med := j;
mediana := med;
writeln();
writeln(' El nuevo pivote es : ', med);
writeln();
readln;
end;
(*************************************************************************************************************)
procedure seleccion(vector : Tvector; posic : integer; var dcha : integer);
var
i, j : integer;
begin
i := 1;
j := MAX;
repeat
P := mediana(vect, i, j);
pivotebis(vect, i, j, P, izda, dcha);
if (s > izda) then
j := izda + 1
else if (s < dcha) then
i := dcha - 1;
until ((izda <= s) and (s <= dcha));
writeln( s, '-esima posicion del vector es :', P);
writeln();
end;
(*************************************************************************************************************)
procedure leer_fichero(var fich : text; var vect : Tvect);
begin
assign(fich,'informacion.dat');
reset(fich);
cont := 0;
while not eof(fich) do
begin
while not eoln(fich) do
begin
read(fich, info);
s := info;
write(s);
end;
readln();
while not eoln(fich) do
begin
cont := cont + 1;
read(fich, info);
vect[cont] := info;
write(vect[cont]);
end;
seleccion(vect, s, cont);
if not eof(fich) then
readln(fich);
end;
end;
(*************************************************************************************************************)
procedure elija(selecc : integer);
begin
case selecc of
1 : leer_fichero(fich, vect);
end;
end;
(*************************************************************************************************************)
procedure menu;
var
opc : integer;
begin
repeat
clrscr;
writeln();
writeln('============MENU=============');
writeln('=== ===');
writeln('=== 1. Programa ===');
writeln('=== 2. Exit ===');
writeln('=== ===');
writeln('=============================');
writeln();
write('Elija una opcion: ');
readln(opc);
elija(opc);
until (opc = OPCIONES_MENU);
end;
(*************************************************************************************************************)
begin
menu;
end.