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

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

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

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


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


Отсортировать ВСЕ данные ниже главной диагонали.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2005 17:07
Сообщение #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
Как эта матрица должна выглядеть ПОСЛЕ сортировки?
 К началу страницы 
+ Ответить 
Lidroot
сообщение 27.10.2005 17:19
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2005 17:35
Сообщение #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.
 К началу страницы 
+ Ответить 
Lidroot
сообщение 27.10.2005 17:51
Сообщение #7


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


Понятно. У меня просто было еще одно задание: Сортировка матрицы, так я делал через матрицу. Придется менять smile.gif еще раз спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2005 20:55
Сообщение #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.
 К началу страницы 
+ Ответить 
klem4
сообщение 29.10.2005 13:37
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.10.2005 13:44
Сообщение #12


Гость






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

Вполне возможно, только ЭТО не сортирует элементы ниже главной диагонали... :no: Сортирует ниже побочной
 К началу страницы 
+ Ответить 
Lidroot
сообщение 29.10.2005 18:31
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.10.2005 18:36
Сообщение #14


Гость






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

 



- Текстовая версия 20.07.2025 7:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"