Сортировка неповозрастанию - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Матрица n*m. Заполнить случайными числами. Отсартировать неповозрастанию по заданной схеме

Решение задачи: «Сортировка неповозрастанию»

textual
Листинг программы
const
  max_col = 4;
  max_row = 4;
 
type
  tdirection = (right, left_down, down, right_up);
const
  delta: array[tdirection] of record X, Y: integer end =
  ( (X: 1; Y: 0), (X:-1; Y: 1), (X: 0; Y: 1), (X: 1; Y:-1) );
 
function get_next(var dir: tdirection; var col, row: integer): boolean;
var
  new_col, new_row: integer;
  ok: boolean;
begin
  get_next := false;
  if (row = max_row) and (col = max_col) then exit;
 
  case dir of
    right:
      if row = 1 then dir := left_down
      else dir := right_up;
    down:
      if col = 1 then dir := right_up
      else dir := left_down;
  end;
 
  repeat
 
    new_col := col + delta[dir].x; new_row := row + delta[dir].y;
    ok := (new_col >= 1) and (new_col <= max_col) and
          (new_row >= 1) and (new_row <= max_row);
 
    if not ok then
      case dir of
        right: dir := down;
        left_down: dir := down;
        down: dir := right;
        right_up: dir := right;
      end;
 
  until ok;
  col := new_col; row := new_row;
  get_next := true;
 
end;
 
var
  a: array[1 .. max_row, 1 .. max_col] of integer;
  dir: tdirection;
 
  i, j,
  _col, _row,
  first_row, first_col, mx_row, mx_col: integer;
  value: integer;
  T: integer;
 
begin
  writeln('before:');
  for _row := 1 to max_row do
  begin
    for _col := 1 to max_col do
    begin
      a[_row, _col] := random(20);
      write(a[_row, _col]:4);
    end;
    writeln;
  end;
 
  for i := 1 to max_row * max_col - 1 do begin
 
    _col := 1; _row := 1;
    dir := right_up;
 
    for j := 1 to pred(i) do get_next(dir, _col, _row);
    first_col := _col; first_row := _row;
 
    mx_row := first_row; mx_col := first_col;
    repeat
 
      if a[mx_row, mx_col] < a[_row, _col] then begin { <--- Здесь можно изменить направление }
        mx_row := _row; mx_col := _col;
      end
 
    until not get_next(dir, _col, _row);
    T := a[first_row, first_col];
    a[first_row, first_col] := a[mx_row, mx_col];
    a[mx_row, mx_col] := T;
 
  end;
 
  writeln('after:');
  for _row := 1 to max_row do begin
    for _col := 1 to max_col do begin
      write(a[_row, _col]:4);
    end;
    writeln;
  end;
 
end.

Объяснение кода листинга программы

Этот код реализует алгоритм сортировки пузырьком. Он начинается с первой строки и первого столбца массива и сравнивает текущую пару элементов (текущую строку и столбец) с последующей парой. Если текущая пара меньше последующей, то он меняет их местами. Этот процесс повторяется до тех пор, пока массив не будет полностью отсортирован. Код использует вложенные циклы для прохода по массиву. Внешний цикл отвечает за проход по строкам массива, а внутренний цикл - за проход по столбцам. Функция get_next используется для определения следующего шага движения вправо или вниз. Она проверяет, достигли ли мы конца строки или столбца, и если да, то меняет направление движения на противоположное. В конце кода выводится отсортированный массив.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы