Помощь - Поиск - Пользователи - Календарь
Полная версия: Сквозная сортировка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Серж
Есть ли какой-то алгоритм так называемой сквозной сортировки 2-мерного массива.
например:
2 4 8
5 2 3
3 7 1
в рез-те должно отсортировать так:
1 3 5
2 3 7
2 4 8
И разложение данного массива в одномерный, а потом сортировка его и опять запись в 2-мерный - не катит.
Merlin
Серж Может нужно отсортировать каждую строку по возрастанию .
volvo
Насколько видно из приведенного примера - матрица сортируется "по столбцам"...

Если "не катит" разложение массива в одномерный, и потом обратная запись в матрицу, можно предложить приведение типа матрицы к массиву (фактически никакого разложения не происходит, ты просто заставишь компилятор "под другим углом" посмотреть на матрицу), или придется шаманить с индексами - готовь большой бубен...
Серж
Цитата(volvo @ 18.04.2006 20:06) *

Если "не катит" разложение массива в одномерный, и потом обратная запись в матрицу, можно предложить приведение типа матрицы к массиву (фактически никакого разложения не происходит, ты просто заставишь компилятор "под другим углом" посмотреть на матрицу), или придется шаманить с индексами - готовь большой бубен...

A что понимается под приведением типа матрицы к массиву? И как это происходит?
volvo
Приведение матрицы к массиву - ты говоришь компилятору, что "на те данные, которые я раньше описал, как матрицу, в этом случае нужно смотреть, как на одномерный массив"... То есть, ФАКТИЧЕСКИ, никаких преобразований матрицы в одномерный массив не производится, ФИЗИЧЕСКИ ты работаешь с той же матрицей, так что, по-моему, приведенное тобой условие нигде не нарушается.

Как сделать? Ну, например, вот так:
const
size_x = 3;
size_y = 3;

type
column = array[1 .. size_y] of integer;
matrix = array[1 .. size_x] of column;

pvector = ^vector;
vector = array[1 .. maxInt div sizeof(integer)] of integer;

const
{ ВНИМАНИЕ: Заполнение матрицы - не построкам, а по столбцам !!! }
a: matrix = (
(2, 5, 3), { 1 столбец }
(4, 2, 7), { 2 столбец }
(8, 3, 1) { 3 столбец }
);

procedure print(const mx: matrix);
var i, j: integer;
begin
for i := 1 to size_x do begin
for j := 1 to size_y do
write(mx[j][i]:4);
writeln;
end;
end;

procedure bubble(var ar: vector; n: integer);
var i, j, T: Integer;
begin
for i := 1 to n do
for j := n downto i + 1 do
if ar[Pred(j)] > ar[j] then begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
end
end;

begin
writeln('before:');
print(a);

bubble(pvector(@a)^, size_x * size_y);

writeln('after:');
print(a);
end.
Серж
спасибо Volvo
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.