kmenores.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Encontrar los $k$ enteros menores en un arreglo de longitud
$n$. Se hace b\'usqueda del m\'inimo $k$ veces o
clasificaci\'on r\'apida (quicksort), seg\'un sea $k$ con
respecto a $log(n)$.
keywords: clasificacion
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: kmenores.pas 2002/06/11 22:19 rodrigop Exp rodrigop$ }
{ Aqui se uso la funcion ln ya que en pascal no existe log
en base dos, pero esta es la que habria que utilizar para
evaluar la relacion k <=> log_2 (n) }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
program k_menores;
uses u_lispif;
const
n = 100;
k = 3;
var
A : array [1..n] of integer;
i, j : integer;
L, L1 : lispif;
min, r : tipo_elemento;
q, qmin : posicion;
zlog : real ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SWAP (var a : integer; var b : integer);
var
t : integer;
begin
t := a;
a := b;
b := t
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure QUICKSORT (left, right : integer);
var
p : integer;
{notar : nested function}
function PARTITION: integer;
var
pivot : integer;
l, r : integer;
begin
pivot := A[right];
l := left;
r := right-1;
repeat
while (a [l] < pivot) do l := l + 1;
while (a [r] >= pivot) and (l < r) do r := r - 1;
SWAP (A [l] , A [r])
until (l >= r);
SWAP (A [l], A [r]);
SWAP (A [l], A [right]);
PARTITION := l
end; { PARTITION }
begin { QUICKSORT }
if ( left < right ) then begin
p := PARTITION;
QUICKSORT ( left, p - 1);
QUICKSORT (p + 1, right)
end {if}
end; { QUICKSORT }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
begin
writeln ;
randomize;
for i:=1 to n do A [i] := random (200);
zlog := ln (n);
if ( k < zlog ) then
begin
L.ANULA;
L1.ANULA;
for j := 1 to n do L.INSERTA (A [j], L.PRIMERO);
L.IMPRIME ('listado del arreglo: ');
writeln ;
writeln ('como k = ', k);
writeln ('es menor a ln (n) = ', zlog:5:5);
writeln ('entonces busca el menor k veces en la lista');
writeln ;
for j:=1 to k do begin
q := L.PRIMERO;
min := L.RECUPERA(q);
while (q <> L.FIN) do begin
r := L.RECUPERA (q);
if (r < min) then begin
min := r;
qmin:=q;
end; {if}
q := L.SIGUIENTE (q);
end; {while}
L.SUPRIME (qmin);
L1.INSERTA (min, L1.FIN);
end; {j}
L1.IMPRIME ('listado de los k menores: ');
end {then}
else begin
writeln ('listado del arreglo: ');
for i := 1 to n do write (A [i] : 4);
writeln;
writeln ('como ln (n) = ', zlog:5:5);
writeln ('es menor que k = ', k);
writeln ('hace quicksort e imprime los k menores' );
writeln ('que estan en las k-primeras posiciones');
writeln ('del arreglo ordenado ');
QUICKSORT (1,n);
writeln ('listado de los k = ', k,' menores:');
for i := 1 to k do writeln (A [i]:1);
end; {if}
writeln ;
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.