Помощь - Поиск - Пользователи - Календарь
Полная версия: Сквозная сортировка
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.