Что за bug?
Прога неработающая - это сразу говорю.
Но вот после нескольких компиляции и изменения
const n=3;
вытворяет чудеса вывода на экран.
Может это только у меня с нею что то не так??
uses crt;
const n=3;
var
h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
writeln;
end;
writeln;writeln('>>>>>>>>>>>>>>>');writeln;
i1:=1;j1:=1; i2:=1;j2:=2;
for i:=1 to n*n-1 do begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
inc(j1);inc(j2);
inc(j2);
if j2>n then begin
j2:=1;
inc(i2);
end;
end;
for i:=1 to n do begin
for j:=1 to n do begin write(a[i,j]:3);end;
writeln;
end;
end.
const n=3;
var
h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
writeln;
end;
writeln;writeln('>>>>>>>>>>>>>>>');writeln;
i1:=1;j1:=1; i2:=1;j2:=2;
for i:=1 to n*n-1 do begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
inc(j1);inc(j2);
[color=RED]{inc(j2);}[/color]
if j2>n then begin
j2:=1;
inc(i2);
end;
end;
for i:=1 to n do begin
for j:=1 to n do begin write(a[i,j]:3);end;
writeln;
end;
end.
После этого изменения чудеса прекратились.
Если не тяжело, можешь описать алгоритм сортировки? Словами.
Если не тяжело, можешь описать алгоритм сортировки? Словами.
Это недаработаный вариант сортировки двухмерного массива, сделаный как ответ, по теме "сортировка 2-го массива" :), но вот перерасказывать это нет уж - она неправельная,и не рабочая.
Просто хотелось узнать другие мнения :D
Может быть Вы сможите обьяснить на "техническом уровне" что она делает не так (hB800 - например меняется)??(Если не трудно:)
Вот и доработаная прога, прошу указывать на мои ошибки нестеснясь:D
var h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
writeln;
end;
writeln;writeln('>>>>>>>>>>>>>>>');writeln;
i1:=1;j1:=1;i2:=1;j2:=2;
for i:=1 to n*n do
for j:=1 to n*n do
begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
j1:=j2;
i1:=i2;
inc(j2);
if j2>n then begin
j2:=1;
inc(i2);
end;
if i2>n then begin i1:=1;j1:=1;i2:=1;j2:=2;end;
end;
for i:=1 to n do begin
for j:=1 to n do begin write(a[i,j]:3);end;
writeln;end;
end.
..., а пердставление двуумерного массива одномерным, с последующей сортировкой. Вот.
Извените - немного не понятно?
Ладно спасибо за ответы.
Вот и доработаная прога, прошу указывать на мои ошибки нестеснясь:D
Нормально. Единственный минус, что несмотря ни на что, будет выполнено n*n*n*n сравнений. Даже если матрица будет отсортирована после n*n сравнений, прога произведет еще n*n*n*n-n*n сравнений. Нужна бы лог. переменная, которой присвоить true, если была перестановка. И при достижении i2 n не автоматически сбрасывать в 1, а только если эта перменная равна true(иначе выход из цикла). Кроме этого, достаточно только одного цикла while true do begin ... end;
... будет выполнено n*n*n*n сравнений....
... Кроме этого, достаточно только одного цикла while true do begin ... end;
Имеется ввиду чтото вроде этого?
Или я опять непонял? :(
....
i1:=1;j1:=1;i2:=1;j2:=2;
repeat
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
j1:=j2;i1:=i2;inc(j2);
if j2>n then begin j2:=1;inc(i2);end;
if i2>n then begin i1:=1;j1:=1;i2:=1;j2:=2;end;
inc(col);
until col>=n*n;
Этого не будет мало? может нужно n*n*n;
Имеется ввиду чтото вроде этого?
не совсем. задавать наперед число сравнений не стОит. что-то типа
var h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
flag: Boolean;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=random(50);
write(a[i,j]:3);
end;
writeln;
end;
writeln;
writeln('>>>>>>>>>>>>>>>');
writeln;
flag := false;
i1:=1;j1:=1;i2:=1;j2:=2;
while true do begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
flag := true;
end;
j1:=j2;
i1:=i2;
inc(j2);
if j2>n then begin
j2:=1;
inc(i2);
end;
if i2>n then begin
if flag = true then begin
i1:=1;j1:=1;i2:=1;j2:=2;
flag := false; end
else
break;
end;
end;
for i:=1 to n do begin
for j:=1 to n do begin
write(a[i,j]:3);
end;
writeln;
end;
end.
Проход заново по массиву выполняется, только если при предыдущем проходе была перестановка. Но есть еще оптимизированный вариант бубликовой сортировки, при которой по массиву проход с 1 по n делается только раз.
Спасибо кажется понял!
Перестановка элементов продолжается пока при полном проходе через массив [1,1]..[n,m] не случится перестановок!!
Надеюсь правельно? :D