Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка матрицы ниже главной диагонали
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Lidroot
Смысл задачи: выполнить сортировку элементов, расположенных ниже главной диагонали матрицы. Заранее спасибо.
volvo
To: Lidroot
Каким именно способом? По столбцам? По строкам? Или просто отсортировать все данные, которые находятся НИЖЕ главной диагонали?
Lidroot
Отсортировать ВСЕ данные ниже главной диагонали.
volvo
Хорошо... Вот пример ДО сортировки:
Цитата
1 2 3 4 5
2 3 4 5 6
7 6 3 2 5
3 8 5 0 9
9 1 7 5 8
Как эта матрица должна выглядеть ПОСЛЕ сортировки?
Lidroot
Должно что то вроде
Цитата
1 2 3 4 5
2 3 4 5  /0
7 6 3  /1 2
3 8  /5 5 5
9  /6 7 8 9
volvo
smile.gif Только не путай главную и побочную диагональ... Ты сделал относительно побочной... Вот относительно главной:
const
n = 5;
type
matrix = array[1 .. n, 1 .. n] of integer;
const
mx: matrix =
((1, 2, 3, 4, 5),
(2, 3, 4, 5, 6),
(7, 6, 3, 2, 5),
(3, 8, 5, 0, 9),
(9, 1, 7, 5, 8));

procedure print_matrix(m: matrix);
var i, j: integer;
begin
for i := 1 to n do begin
for j := 1 to n do
write(m[i, j]:4);
writeln;
end;
end;

var
below: array[1 .. n*n] of integer;
i, j, count: integer;
T: integer;

begin
{ Если нужно вводить матрицу - вводи здесь... }

print_matrix(mx); { До сортировки }
count := 0;

for i := 1 to n do
for j := 1 to i do
if i <> j then begin
inc(count); below[count] := mx[i, j];
end;

{ Сама сортировка }
For i := 1 To count Do
For j := count DownTo i+1 Do
If below[Pred(j)] > below[j] Then { < } Begin
T := below[Pred(j)]; below[Pred(j)] := below[j]; below[j] := T
End;

count := 0;
for i := 1 to n do
for j := 1 to i do
if i <> j then begin
inc(count); mx[i, j] := below[count];
end;

writeln('После сортировки:');
print_matrix(mx);

end.
Lidroot
Очень благодарен... Ты сделал это через дополнительный одномерный массив, а без него обойтись можно, т.е. делать все преобразования сразу в матрице? Если можешь поясни как?
volvo
Цитата
делать все преобразования сразу в матрице
Не думаю, что это стоит делать... Если даже и можно - это будет намного сложнее, и наверняка намного медленнее, т.к. появятся циклы большой вложенности...
Lidroot
Понятно. У меня просто было еще одно задание: Сортировка матрицы, так я делал через матрицу. Придется менять smile.gif еще раз спасибо
volvo
To: Lidroot
Я тут... :smoke: :smoke: ... подумал немного... Что-то у меня получилось, и не совсем сложно, отсортировать матрицу БЕЗ дополнительного массива. Вот так:
const
n = 5;
count = (n * pred(n)) div 2;
type
matrix = array[1 .. n, 1 .. n] of integer;
const
mx: matrix =
((1, 2, 3, 4, 5),
(2, 3, 4, 5, 6),
(7, 6, 3, 2, 5),
(3, 8, 5, 0, 9),
(9, 1, 7, 5, 8));

procedure get_index(var ix, jx: integer; k: integer);
var
finished: boolean;
i, j: integer;
begin
for i := 1 to n do
for j := 1 to i do
if i <> j then begin
dec(k);
if k = 0 then begin
ix := i; jx := j;
end
end;
end;

procedure print_matrix(m: matrix);
var i, j: integer;
begin
for i := 1 to n do begin
for j := 1 to n do
write(m[i, j]:4);
writeln;
end;
end;

var
i, j: integer;
T: integer;

j_ix, j_jx, pj_ix, pj_jx: integer;

begin
print_matrix(mx);

{ sort }
For i := 1 To count Do
For j := count DownTo i+1 Do begin
get_index(j_ix, j_jx, j);
get_index(pj_ix, pj_jx, pred(j));
If mx[pj_ix, pj_jx] > mx[j_ix, j_jx] Then Begin
T := mx[pj_ix, pj_jx];
mx[pj_ix, pj_jx] := mx[j_ix, j_jx];
mx[j_ix, j_jx] := T
End;
end;

writeln('sorted:');
print_matrix(mx);

end.
klem4
Могу предложить еще вот такой вариант без дополнительного массива, возможно будет даже быстрее :


repeat

flag := true;

for i1 := 2 to n do
for j1 := n-i1+2 to n do
for i2 := 2 to n do
for j2 := n-i2+2 to n do
if ((i2>i1)or((i2=i1)and(j2>j1))) and not(mx[i1,j1]<=mx[i2,j2]) then begin
flag := false;
T := mx[i1,j1];
mx[i1,j1] := mx[i2,j2];
mx[i2,j2] := T;
end;

until flag;


:smoke:
volvo
To: klem4
Цитата
возможно будет даже быстрее

Вполне возможно, только ЭТО не сортирует элементы ниже главной диагонали... :no: Сортирует ниже побочной
Lidroot
я тоже немного порыл и нашел неплохой пример


procedure sort(i,j:integer);
var i1,j1,tmp:integer;
begin
for i1:=1 to i do
for j1:=1 to 5 do
if (mas[i,j]>mas[i1,j1]) and ((i1<i) or (j1<j)) then
begin
tmp:=mas[i,j];
mas[i,j]:=mas[i1,j1];
mas[i1,j1]:=tmp;
sort(i1,j1);
end;
end;

for i:=1 to 5 do
for j:=1 to 5 do
sort(i,j);



Но потом хорошо подумав, понял что для чела(которому я помогаю) сортировку надо делать попроще...

P.S. Я сам пытался через матрицу, но как то не шла мысля smile.gif
volvo
To: Lidroot
А ты знаешь, что делает тот алгоритм, который ты привел? Он сортирует ВСЮ матрицу построчно. Запусти программу и убедись... По-моему, требовалось нечто другое unsure.gif
Lidroot


for i:=1 to 5 do
for j:=1 to i do
sort(i,j);



тот был просто пример, изменяешь одну буковку и усе работает smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.