uses
crt;
var
a: array[1..200, 1..200] of integer;
i, j, m, n, z, x, incr, l, k, tmp, t, p: integer;
begin
textbackground(blue);
clrscr;
textcolor(yellow);
randomize;
repeat {ogranichenie na vvod}
writeln('vvedite chislo strok');
readln(m);
until (m >= 1) and (m <= 200);
repeat {ogranichenie na vvod}
writeln('vvedite chislo stolbtsov');
readln(n);
until (n > 1) and (n <= 200);
{zapolnenie matrix}
for i := 1 to m do
begin
for j := 1 to n do
a[i, j] := random(101) + 11;
end;
textcolor(red);
writeln('ishodnaia matritsa');
textcolor(white);
for i := 1 to m do
begin
for j := 1 to n do
write(a[i, j], ' ');
writeln;
end;
{sortirovka matrix}
for i := 1 to m do
begin
for j := 1 to n do
{proverka na chetnost}
if j mod 2 <> 0 then
begin
{metod pusirka}
for k := 1 to m - 1 do
begin
for l := m - 1 downto k do
if a[l, j] > a[l + 1, j] then
begin
inc(x); {perestanovki}
tmp := a[l, j];
a[l, j] := a[l + 1, j];
a[l + 1, j] := tmp;
end;
inc(t); {prohodi}
end; {konets pusirka}
end
else
if j mod 2 = 0 then
begin
{sortirovka shella}
incr := m div 2;
while incr > 0 do
begin
for k := incr + 1 to m do
begin
l := k - incr;
while l > 0 do
if a[l, j] > a[l + 1, j] then
begin
inc(z); {perestanovki}
tmp := a[l, j];
a[l, j] := a[l + 1, j];
a[l + 1, j] := tmp;
l := l - incr
end
else
l := 0
end;
incr := incr div 2;
inc(p); {prohodi}
end; {tsikl sortirivki zaconchilsa}
end;
end; {konets vsego tsikla}
textcolor(red);
writeln('novi matrix');
textcolor(white);
for i := 1 to m do
begin
for j := 1 to n do
write(a[i, j], ' ');
writeln;
end;
textcolor(yellow);
writeln('ostalnoe-----------------------------------');
writeln('prohodi shella =', ' ', p);
writeln('prohodi puzirk =', ' ', t);
writeln('perestanovki shella =', ' ', z);
writeln('perestanovki pusirka =', ' ', x);
readln;
end.