Ocena użytkownikóww: ***** / 1
Nadesłany przez Tomasz Lubiński, 27 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Algorytm Hoare/Project1.dpr:
//algorytm Hoare'a
//www.algorytm.org
//Tomasz Lubiński (c)2003
program Project1;
uses
SysUtils;
{$R *.RES}
{$Apptype Console}
var
n,i,j,k,w: Integer;
c: Array [1..100] of Integer;
function partition(var c: Array of Integer; a,b: Integer): Integer;
var
e,tmp: Integer;
begin
//nalezy odjac 1 bo c przekazywane przez parametr ma indeksy od 0
//a w ciele programu ktory ja wywolal ma indeksy od 1
a:=a-1;
b:=b-1;
e:=c[a]; //elemennt dzielacy
while a<b do
begin
while ((a<b) and (c[b]>=e)) do b:=b-1;
while ((a<b) and (c[a]<e)) do a:=a+1;
if (a<b) then
begin
tmp:=c[a];
c[a]:=c[b];
c[b]:=tmp;
end;
end;
//należy dodac jeden do wyniku bo c na ktorym byly wykonane obliczenia
//jest przekazywane przez parametr i ma indeksy od 0
//a w ciele programu ktory ja wywolal ma indeksy od 1
partition:=a+1;
end;
begin
writeln('Podaj liczbe elementow ciagu');
readln(n);
for i:=1 to n do
begin
writeln('Podaj '+IntToStr(i)+' element ciagu');
readln(c[i]);
end;
writeln('Podaj ktory element obliczyc');
readln(w);
//algorytm Hoare'a
i:=1;
j:=n;
n:=w;
while (i<>j) do
begin
k:=partition(c,i,j);
k:=k-i+1;
if k>=w then
j:=i+k-1;
if k<w then
begin
w:=w-k;
i:=i+k
end;
end;
writeln(IntToStr(n)+' element ciagu to '+IntToStr(c[i]));
readln;
end.