Двумерный массив A[n,n]
Помогите отсортировать двумерный массив A[n,n] или скиньте линку на алгоритм.
А как отсортировать?
Типа
1 1 1 1
1 2 2 2
1 2 3 3
1 2 3 4 ?
или
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4 ?
Уточни
начальный
1 4 1 6
1 2 6 2
6 2 3 3
1 2 3 4
конечный
1 1 1 1
2 2 2 2
3 3 3 4
4 6 6 6
Вот так
начальный конечный
1 4 1 6 1 1 1 1
1 2 6 2 2 2 2 2
6 2 3 3 3 3 3 4
1 2 3 4 4 6 6 6
Лучше тогда скажи правило сортировки...
Лучше тогда скажи правило сортировки...
Ежели пузырем, тогда довольно просто.
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;
i1:=i2;j1:=j2;
inc(j2);
if j2>n then
begin
j2:=1;
inc(i2);
end;
end;
Вот, примерно так.
Мне нужно методом вставки и выборки,но выборкой я уже сделал,осталось методом вставки.
Как в одномерном, знаешь?
Как в одномерном, знаешь?
В одномерном очень легко и понятно,а для двумерного даже приблизительно не могу составить.
Метод вставки одн.мас. по возрастанию:
for i:=2 to n do
begin
while (a>a[i-1])and(i>1) do
begin
b:=a;
a:=a[i-1];
a[i-1]:=b;
i:=i-1;
end;
end;
В одномерном очень легко и понятно,а для двумерного даже приблизительно не могу составить.
Если я правильно понял принцип, по которому надо отсортировать массив, то я бы сделал так: взял бы процедуру сортировки одномерного массива, и в качестве параметра передал бы указатель на первый элемент двумерного массива. Это будет работать, т.к. двумерный массив будет храниться в памяти так: сначала первая строчка, потом вторая, потом третья и т.д. Думаю, можно сделать что-нибудь в этом роде:
Ежели пузырем, тогда довольно просто.
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;
i1:=i2;j1:=j2;
inc(j2);
if j2>n then
begin
j2:=1;
inc(i2);
end;
end;
Вот, примерно так.
Я вот скопировал в *.pas и запустил ... у меня не пошло ;) Решил доработать - вроде получилось:
uses crt;
const n=5;
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.
Заранее спасибо!