IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка матрицы ниже главной диагонали, не могу догадаться, как это сделать
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Смысл задачи: выполнить сортировку элементов, расположенных ниже главной диагонали матрицы. Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






To: Lidroot
Каким именно способом? По столбцам? По строкам? Или просто отсортировать все данные, которые находятся НИЖЕ главной диагонали?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Отсортировать ВСЕ данные ниже главной диагонали.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Хорошо... Вот пример ДО сортировки:
Цитата
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
Как эта матрица должна выглядеть ПОСЛЕ сортировки?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Должно что то вроде
Цитата
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Очень благодарен... Ты сделал это через дополнительный одномерный массив, а без него обойтись можно, т.е. делать все преобразования сразу в матрице? Если можешь поясни как?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
делать все преобразования сразу в матрице
Не думаю, что это стоит делать... Если даже и можно - это будет намного сложнее, и наверняка намного медленнее, т.к. появятся циклы большой вложенности...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Понятно. У меня просто было еще одно задание: Сортировка матрицы, так я делал через матрицу. Придется менять smile.gif еще раз спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


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:


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






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

Вполне возможно, только ЭТО не сортирует элементы ниже главной диагонали... :no: Сортирует ниже побочной
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


я тоже немного порыл и нашел неплохой пример


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






To: Lidroot
А ты знаешь, что делает тот алгоритм, который ты привел? Он сортирует ВСЮ матрицу построчно. Запусти программу и убедись... По-моему, требовалось нечто другое unsure.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +




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



тот был просто пример, изменяешь одну буковку и усе работает smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.12.2021 7:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name