Сортировка двумерного массива методом пузырька

tacinka125

Необходимо написать программу. В которой двумерный массив заполненный случайными числами от А до Б, нужно отсортировать методом пузырька, при этом размерность массива вводится с клавиатуры. Вообщем проблема в сортировки примеров с одномерным массивом масса, а многомерных нет. Во вторник экзамен прошу помочь!
6 ответов

tacinka125

tacinka125, как вариант, развернуть многомерный массив в одномерный, отсортировать его, и сделать обратное преобразование.


tacinka125

Я так и думал но нарисовалась еще одна проблема в размере массива мне его нужно задавать. В паскале размерность почему то только константы, мне и столбцы и строки нужно вводить заранее большим числом, а строить только по введенным величинам? плюс Второй массив тоже придется делать заранее большим?
const
    m = 1000;
 
var
    arr: array[1..m] of integer;
    i, j, k,u,a,y: integer;
 
begin
 
writeln ('Vvedite dlinu massiva  ');
read(a);
writeln ('Zadayte interval cisel dlya zapolneniya massiva ot A do B');
readln(u);
read (y);
 
    randomize;
 
    write ('Исходный массив: ');
    for i := 1 to a do begin
        arr[i] :=u+ random(y);
        write (arr[i]:4);
    end;
    writeln; writeln;
 
 
    for i := 1 to a-1 do
        for j := 1 to a-i do
            if arr[j] > arr[j+1] then begin
                k := arr[j];
                arr[j] := arr[j+1];
                arr[j+1] := k
            end;
 
    write ('Отсортированный массив: ');
    for i := 1 to a do
        write (arr[i]:4);
 
    writeln;
 
readln
end.
вот моя программа. Только у меня получилось с одномерным\массивом а для двумерного никак(


tacinka125

Это же PascalABC. И наверное здесь есть динамические массивы и матрицы.
var
  a: array of array of integer;
begin
  SetLength(a, m, n);
  for i:=0 to m-1 to
    for j:=0 to n-1 do
      a[i, j]:=i*10+j;
end.
По поводу сортировки. Можно знаешь как сделать. Не трогая матрицу, делать преобразование индексов. И процедура сортировки даже не догадается, что уже не с массивом работает. Т.е. получаешь на вход процедуры сортировки матрицу вместо массива. Все действия по сортировки такие, как с массивом. Организуешь обычные два цикла по i (от 0 до m*n-1) и j (не помню, но соответствующие). Но к элементам матрицы обращаешься так a[i div n, i mod n] или a[j div n, j mod n]. Может я что-то поднапутал с a[i div n, i mod n], но идея всё равно такая.У меня нет PascalABC, но на FreePascal это компилируется и работает
program MatrixSort;
 
type
  TMatrix = array of array of integer;
 
  procedure SortMatrix(var a: TMatrix; m, n: integer);
  var
    i, j: integer;
    t: integer;
  begin
 
    for i := 0 to (m * n - 1) do
      for j := 0 to (m * n - 1) - i - 1 do
        if a[j div n, j mod n] > a[(j + 1) div n, (j + 1) mod n] then
        begin
          t := a[j div n, j mod n];
          a[j div n, j mod n] := a[(j + 1) div n, (j + 1) mod n];
          a[(j + 1) div n, (j + 1) mod n] := t;
        end;
  end;
 
var
  m, n: integer;
  i, j: integer;
  a: TMatrix;
begin
  {ввод размерности и заполнение матрицы}
  m := 2;
  n := 8;
  SetLength(a, m, n);
  for i := 0 to m - 1 do
    for j := 0 to n - 1 do
      a[i, j] := 10 * (m - i) + (n - j);
  {матрица до сортировки}
  writeln('Before:');
  for i := 0 to m - 1 do
  begin
    for j := 0 to n - 1 do
      Write(a[i, j]: 4);
    writeln;
  end;
  {вызов процедуры сортировки}
  SortMatrix(a, m, n);
  {матрица после сортировки}
  writeln('After');
  for i := 0 to m - 1 do
  begin
    for j := 0 to n - 1 do
      Write(a[i, j]: 4);
    writeln;
  end;
end.
Результат работы
Before: 28 27 26 25 24 23 22 21 18 17 16 15 14 13 12 11 After 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28
Если что, замени динамические массивы на обычные.


tacinka125

Это же PascalABC. И наверное здесь есть динамические массивы и матрицы.
В простом АВС этого нет, а в АВС.net есть.


tacinka125

Спасибо. Постараюсь запомнить.Тогда в проге из поста #4 заменить
type
  TMatrix = array [0..99, 0..99] of integer;
и удалить строку 30 - SetLength.


tacinka125

Спасибо огромное. Но с моими знаниями в программировании. Я замутил нечто ужасное но оно работает как надо. И выводит все красиво))
const
    m = 1000;
 N=30;
 T =30;
var
    arr: array[1..m] of integer;
    arr2: array[1..n,1..t] of integer;
 
    i, j, k,u,a,y,b,g,p,r: integer;
 
begin
 
writeln ('Vvedite kol-vo strok massiva  ');
read(a);
writeln ('Vvedite kol-vo stolbcov massiva  ');
read(b);
writeln ('Zadayte interval cisel dlya zapolneniya massiva ot A do B');
readln(u);
read (y);
g:=a*b;
    randomize;
 
    for i := 1 to g do begin
        arr[i] := random(y)+u;
        end;
    writeln; writeln ('ishodniy massiv');
     writeln;
    for i:=1 to a do
  for j:=1 to b do
  begin
    r:=r+1;
    arr2[i,j]:=arr[r];
  end;
 
  for i:=1 to a do
  begin
  for j:=1 to b do
  write(arr2[ i,j],'  '); writeln end;
 
  writeln;
  writeln;
 
 
    for i := 1 to g-1 do
        for j := 1 to g-i do
            if arr[j] > arr[j+1] then begin
                k := arr[j];
                arr[j] := arr[j+1];
                arr[j+1] := k
            end;
 writeln ('Sortirovanniy massiv');
  writeln;
 for i:=1 to a do
  for j:=1 to b do
  begin
    p:=p+1;
    arr2[i,j]:=arr[p];
  end;
 
  for i:=1 to a do
  begin
  for j:=1 to b do
  write(arr2[ i,j], '  '); writeln end;
 
 
readln
end.
всем спасибо