[#1]
problem z progamem w pascalu
Może mi ktos pomóc. Mianowicie nei chce mi ten program sortować liczb. Czy ktokolwiek wie jak moża zrobić aby ten program mógł sortowac???
Jeśli tak to bede wdzićczny za pomoc
a o to ten program:
PROGRAM Sort;
USES CRT;
CONST
wymiar=100;
MAXWART=20000;
TYPE
TElement=INTEGER;
tablice=ARRAY[0..wymiar] OF TElement;
typ =INTEGER;
VAR a:tablice;
jk,n:integer;
z:char;
PROCEDURE Zamien(VAR a,b:TElement);
VAR p:TElement;
BEGIN
p:=a;
a:=b;
b:=p;
END;
PROCEDURE InsertionSort(VAR tabl:tablice;d,g:typ);
VAR
i,j :INTEGER;
w:TElement;
BEGIN
i:=d+1;
WHILE i<=g DO
BEGIN
w:=tabl[i];
j:=i;
WHILE (j>d) AND (w
BEGIN
tabl[j]:=tabl[j-1];
DEC(j)
END;
tabl[j]:=w;
INC(i)
END
END; {InsertionSort}
PROCEDURE InsertSortWart (VAR tabl:tablice;d,g:typ);
VAR
j,i:INTEGER;
w :TElement;
BEGIN
i:=d+1;
WHILE i<=g DO
BEGIN
w:=tabl[i];
tabl[0]:=w;
j:=i;
WHILE w
BEGIN
tabl[j]:=tabl[j-1];
DEC(j)
END;
tabl[j]:=w;
INC(i)
END
END; {InsertSortWart}
PROCEDURE InsertSortWart2 (VAR tabl:tablice;d,g:typ);
VAR
j,i:INTEGER;
w :TElement;
BEGIN
i:=d+1;
WHILE i<=g DO
BEGIN
w:=tabl[i];
tabl[0]:=w;
j:=i;
WHILE w
DEC(j);
MOVE(tabl[j],tabl[j+1],sizeof(TElement)*(i-j));
tabl[j]:=w;
INC(i)
END
END; {InsertSortWart2}
PROCEDURE InsertSort2(VAR tab:tablice;CONST n:INTEGER);
VAR
pom:TElement;
i,j:INTEGER;
d,g,s:INTEGER;
BEGIN
FOR i:=2 TO n DO
BEGIN
IF tab[i-1]>tab[i]
THEN
BEGIN {element i nie jest na swoim miejscu}
pom:=tab[i];
d:=1;
g:=i-1;
WHILE d<=g DO
BEGIN
s:=(d+g) SHR 1;
{szybsze niz (d+g) div 2}
IF tab[s]<=pom
THEN d:=succ(s)
ELSE g:=pred(s)
END;
move(tab[s],tab[s+1],sizeof(TElement)*(i-s));
{duzo szybsze niz ciag przepisan}
tab[s]:=pom
END
END
END;
PROCEDURE ShellSort(VAR tabl:tablice;d,g:typ);
VAR
k,i,j:INTEGER;
w :TElement;
BEGIN
k:=1;
WHILE k
k:=k+k;
WHILE k>1 DO
BEGIN
k:=k DIV 2;
i:=d+k;
WHILE i<=g DO
BEGIN
w:=tabl[i];
j:=i;
WHILE (j-k>=d) AND (w
BEGIN
tabl[j]:=tabl[j-k];
DEC(j,k)
END;
tabl[j]:=w;
Inc(i)
END
END
END; {ShellSort}
PROCEDURE ShellWirth(VAR tabl:tablice;d,g:typ);
CONST
t=4;
VAR
i,j,k,s:typ;
w :TElement;
m :1..t;
h :ARRAY[1..t] OF INTEGER;
BEGIN
h[1]:=9;
h[2]:=5;
h[3]:=3;
h[4]:=1;
FOR m:=1 TO t DO
BEGIN
k:=h[m];
s:=-k; {miejsce wartownika}
FOR i:=k+1 TO g DO
BEGIN
w:=tabl[i];
j:=i-k; {element porownywany i przesuwany}
IF s=0
THEN s:=-k;
s:=s+1; {okreslenie miejsca wstawienia wartownika dla
kolejnych elementow}
tabl[s]:=w;
WHILE w
BEGIN
tabl[j+k]:=tabl[j];
j:=j-k
END;
tabl[j+k]:=w
END
END
END;
PROCEDURE BubbleSort(VAR tabl:tablice;d,g:typ);
VAR
i,j:INTEGER;
BEGIN
WHILE g>d DO
BEGIN
j:=d;
FOR i:=d TO g-1 DO
IF tabl[i]>tabl[i+1]
THEN
BEGIN
zamien(tabl[i],tabl[i+1]);
j:=i
END;
g:=j
END
END; {BubbleSort}
PROCEDURE QuickSort(VAR tabl:tablice;dol,g:typ);
PROCEDURE sort(d,g:typ);
VAR
i,j,s:typ;
w:TElement;
BEGIN
i:=d;
j:=g;
s:=(d+g) DIV 2;
w:=tabl[s];
REPEAT
WHILE tabl[i]
INC(i);
WHILE tabl[j]>w DO
DEC(j);
IF i<=j
THEN
BEGIN
zamien(tabl[i],tabl[j]);
INC(i);
DEC(j)
END
UNTIL i>j;
IF d
THEN sort(d,j);
IF i
THEN sort(i,g)
END; {sort}
BEGIN {QuickSort}
sort(1,wymiar)
END; {QuickSort}
PROCEDURE SelectionSort(VAR tabl:tablice;d,g:typ);
VAR
i,j,nrmin,w:typ;
BEGIN
FOR i:=d TO g-1 DO
BEGIN
nrmin:=i;
w:=tabl[nrmin];
FOR j:=i+1 TO g DO
IF tabl[j]
THEN
BEGIN
nrmin:=j;
w:=tabl[nrmin]
END;
zamien(tabl[nrmin],tabl[i])
END
END; {SelectionSort}
PROCEDURE HeapSort(VAR tabl:tablice;d,g:typ; p:byte);
VAR
w,i,j:typ;
PROCEDURE WGore(k:typ);
VAR i:typ;
w:TElement;
BEGIN
w:=tabl[k];
tabl[0]:=MAXWART;
i:=k SHR 1; {k DIV 2}
WHILE tabl[i]
BEGIN
tabl[k]:=tabl[i];
k:=i;
i:=i SHR 1; {i DIV 2}
END;
tabl[k]:=w
END;
PROCEDURE WDol(k,n:typ);
VAR
i:typ;
w:TElement;
znal:BOOLEAN;
BEGIN
w:=tabl[k];
znal:=FALSE;
j:=2*k;
WHILE (j<=n) AND NOT znal DO
BEGIN
IF j
THEN
IF tabl[j]
THEN INC(j);
IF w
THEN
BEGIN
tabl[k]:=tabl[j];
k:=j;
j:=2*k;
END
ELSE Znal:=TRUE;
END;
tabl[k]:=w;
END; {w dol}
BEGIN
IF p=1
THEN
BEGIN
i:=(g-d+1) SHR 1; {szybsze niz (g-d+1) div 2}
WHILE i>=d DO
BEGIN
WDol(i,g);
DEC(i)
END;
END
ELSE
IF p=2
THEN
BEGIN
FOR i:=d+1 TO g DO
WGore(i); {inne doprowadzanie tablicy do kopca}
END;
i:=g; {sortowanie}
WHILE i>d DO
BEGIN
For jk:=1 to n do write(a[jk],' ');
writeln;
zamien(tabl[d],tabl[i]);
DEC(i);
WDol(1,i)
END;
For jk:=1 to n do write(a[jk],' ');
writeln;
END; {HeapSort}
PROCEDURE MergeSort(VAR tabl:tablice;d,g:typ);
VAR
s:INTEGER;
PROCEDURE scal(p,g,k:INTEGER;VAR tabl:tablice);
VAR
i,j,l:INTEGER;
z :tablice;
BEGIN
i:=p;
j:=g;
l:=p;
WHILE (i
BEGIN
IF tabl[i]<=tabl[j]
THEN
BEGIN
z[l]:=tabl[i];
i:=i+1
END
ELSE
BEGIN
z[l]:=tabl[j];
j:=j+1
END;
l:=l+1
END; {WHILE}
WHILE i
BEGIN
z[l]:=tabl[i];
l:=l+1;
i:=i+1
END;
WHILE j<=k DO
BEGIN
z[l]:=tabl[j];
l:=l+1;
j:=j+1
END;
FOR i:=p TO k DO
tabl[i]:=z[i]
END; {scal}
BEGIN
IF d
THEN
BEGIN
s:=(d+g) SHR 1;
MergeSort(tabl,d,s);
MergeSort(tabl,s+1,g);
scal(d,s+1,g,tabl)
END
END;
PROCEDURE WYPIS(a:TAblice;n:integer);
var
i:integer;
BEGIN
for i:=1 to n do
write(' ',a[i]);
end;
BEGIN
clrscr;
Writeln('podaj ilosc liczb');
Readln(n);
Writeln('podaj liczby');
For jk:=1 TO n do
Read(A[jk]);
readln;
writeln('wybierz sortowanie');
readln(z);
CASE z of
'h': HeapSort(A,1,n,1);
'H': HeapSort(A,1,n,2);
END;
Wypis(a,n);
END.