Есть ли какой-то алгоритм так называемой сквозной сортировки 2-мерного массива. например: 2 4 8 5 2 3 3 7 1 в рез-те должно отсортировать так: 1 3 5 2 3 7 2 4 8 И разложение данного массива в одномерный, а потом сортировка его и опять запись в 2-мерный - не катит.
Merlin
19.04.2006 2:55
Серж Может нужно отсортировать каждую строку по возрастанию .
volvo
19.04.2006 3:06
Насколько видно из приведенного примера - матрица сортируется "по столбцам"...
Если "не катит" разложение массива в одномерный, и потом обратная запись в матрицу, можно предложить приведение типа матрицы к массиву (фактически никакого разложения не происходит, ты просто заставишь компилятор "под другим углом" посмотреть на матрицу), или придется шаманить с индексами - готовь большой бубен...
Серж
19.04.2006 20:47
Цитата(volvo @ 18.04.2006 20:06)
Если "не катит" разложение массива в одномерный, и потом обратная запись в матрицу, можно предложить приведение типа матрицы к массиву (фактически никакого разложения не происходит, ты просто заставишь компилятор "под другим углом" посмотреть на матрицу), или придется шаманить с индексами - готовь большой бубен...
A что понимается под приведением типа матрицы к массиву? И как это происходит?
volvo
19.04.2006 21:58
Приведение матрицы к массиву - ты говоришь компилятору, что "на те данные, которые я раньше описал, как матрицу, в этом случае нужно смотреть, как на одномерный массив"... То есть, ФАКТИЧЕСКИ, никаких преобразований матрицы в одномерный массив не производится, ФИЗИЧЕСКИ ты работаешь с той же матрицей, так что, по-моему, приведенное тобой условие нигде не нарушается.
Как сделать? Ну, например, вот так:
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;
beginfor i := 1to size_x dobeginfor j := 1to size_y do
write(mx[j][i]:4);
writeln;
end;
end;
procedure bubble(var ar: vector; n: integer);
var i, j, T: Integer;
beginfor i := 1to n dofor j := n downto i + 1doif ar[Pred(j)] > ar[j] thenbegin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
endend;
begin
writeln('before:');
print(a);
bubble(pvector(@a)^, size_x * size_y);
writeln('after:');
print(a);
end.
Серж
19.04.2006 22:18
спасибо Volvo
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.