1

Тема: Паскаль Сортування

Задану прямокутну матрицю відсортувати методом вибору так, щоб послідовність елементів була такою, як зображено на схемі: перший та останній елемент поміняти місцями.

https://replace.org.ua/misc.php?action=pun_attachment&item=1128

Post's attachments

Безымянный.png 2.36 kb, 254 downloads since 2016-01-28 

2

Re: Паскаль Сортування

А вас батьки не вчили, що коли комусь наказуєте, треба дописати "і швидко, раби!"?

Подякували: FakiNyan, leofun01, DOP3

3

Re: Паскаль Сортування

Це прохання а не наказ!

4

Re: Паскаль Сортування

А батьки вас і прохати не навчили?
Втім, це все не має значення. Ви або робите самі, а ми допомагаємо із тим, що не виходить (якщо у вас не виходь взагалі нічого, спробуйте почитати підручник); або пропонуєте гроші. Більше варіантів тут нема.

Подякували: fed_lviv1

5

Re: Паскаль Сортування

podolets98
Ви уже пробували робити це завдання самостійно? Із чим саме виникли труднощі? Може компілятор якусь помилку видає?
Якщо ви дійсно нічого не хочете робити самі, то тему варто перенести в розділ Пропоную роботу.

Подякували: podolets981

6

Re: Паскаль Сортування

Виникає проблема в самому сортуванні як відсортувати масив як зображено на малюнку, не розумію як виконати таке сортування, мені потрібна частина коду сортування або пояснення як це зробити.

7

Re: Паскаль Сортування

Для початку - ви ж розумієте, що сортувати двовимірний масив неможливо, сортування передбачає переставляння елементів по порядку вздовж однієї вісі координат. Тобто нам треба якось розташувати елемент вздовж однієї лінії.
Тепер - два варіанти, обирайте, який зрозуміліше.
1. Тільки для алгоритмів, що переходять на сусідній елемент (наприклад, бульбашка). Записуємо алгоритм сортування без указання конкретних елементів, тільки з переходами на наступний. Замість звичайної операції переходу на наступний в одномірному масиві

i:=i+1;

підставляємо спеціальну операцію на кшталт

j:=j-1;
if j<0 then begin
  i:=i+1;
  j:=maxj;
end;

для переходу з a[i,j] на наступний, де maxj - висота стовпця.
2. Виводимо формулу, як з "лінійного" номера елемента отримати координати i та j елемента в двовимірному масиві. Це більш універсальний спосіб, хоча й трохи повільніший, бо доведеться ділити. Формули за вас писати не буду, там нескладно - div та mod і пара додавань-віднімань. А потім записуємо будь-який алгоритм сортування з заміною координат.

Подякували: leofun01, podolets98, Torbins3

8

Re: Паскаль Сортування

koala написав:

... сортувати двовимірний масив неможливо ...

Це спірне питання.
Можна чи не можна часто визначається не тільки тим що саме ми сортуємо, але й критерієм впорядкованості.
На скільки я пам'ятаю, сортування - це процес впорядкування елементів послідовності, після якого кожна пара елементів послідовності задовольняє певному критерію.
Наприклад для сортування послідовності дійсних чисел по замовчуванню критерій буде наступним:
Пара чисел (X[і], X[j]), які належать даній послідовності, є впорядкованою, якщо виконується умова:

((i<j)&&(X[і]<=X[j]))||((i>j)&&(X[і]>=X[j]))||(i==j)

Матрицю також можна розглядати як послідовність, але потрібен чіткий критерій впорядкованості.
Припускаю, що podolets98 не може відсортувати матрицю, бо не знає цього критерію.
І я допомогти не зможу, бо для мене картинка ні про що не говорить.
podolets98, якщо це завдання Вам дав викладач, то запитайте його за яким критерієм Ви маєте відсортувати елементи матриці.

Подякували: quez1

9

Re: Паскаль Сортування

Пане leofun01, там малюнок є в автора.

10

Re: Паскаль Сортування

koala написав:

Для початку - ви ж розумієте, що сортувати двовимірний масив неможливо, сортування передбачає переставляння елементів по порядку вздовж однієї вісі координат. Тобто нам треба якось розташувати елемент вздовж однієї лінії.
Тепер - два варіанти, обирайте, який зрозуміліше.
1. Тільки для алгоритмів, що переходять на сусідній елемент (наприклад, бульбашка). Записуємо алгоритм сортування без указання конкретних елементів, тільки з переходами на наступний. Замість звичайної операції переходу на наступний в одномірному масиві

i:=i+1;

підставляємо спеціальну операцію на кшталт

j:=j-1;
if j<0 then begin
  i:=i+1;
  j:=maxj;
end;

для переходу з a[i,j] на наступний, де maxj - висота стовпця.
2. Виводимо формулу, як з "лінійного" номера елемента отримати координати i та j елемента в двовимірному масиві. Це більш універсальний спосіб, хоча й трохи повільніший, бо доведеться ділити. Формули за вас писати не буду, там нескладно - div та mod і пара додавань-віднімань. А потім записуємо будь-який алгоритм сортування з заміною координат.

Сортуючи  кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема

11

Re: Паскаль Сортування

podolets98 написав:

Сортуючи  кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема

Прочитайте те, що я написав, ще один-два рази. Я б сказав "до просвітлення", але не певен, що воно наступить. Зверніть увагу у першому варіанті, що змінюються 2 координати.

Подякували: podolets98, leofun012

12

Re: Паскаль Сортування

koala написав:
podolets98 написав:

Сортуючи  кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема

Прочитайте те, що я написав, ще один-два рази. Я б сказав "до просвітлення", але не певен, що воно наступить. Зверніть увагу у першому варіанті, що змінюються 2 координати.

Вдячний, так справді я прочитав і прийшло декілька варіантів вирішення!

Подякували: Torbins, letitbe2

13 Востаннє редагувалося leofun01 (31.01.2016 00:50:31)

Re: Паскаль Сортування

koala написав:

Пане leofun01, там малюнок є в автора.

Так, я бачив малюнок і для мене завдання залишилося не однозначним.
Думаю, Ваша відповідь є саме тим, що було потрібно автору теми.

Подякували: vova.vladimirovich.70, letitbe2

14 Востаннє редагувалося leofun01 (14.02.2016 19:34:01)

Re: Паскаль Сортування

На прохання користувача podolets98 залишу тут код, який на мою думку виконує сортування матриці саме так, як потрібно користувачу і як підказує зображення.

program SortMatrix;

const
    x_init = 1; x_last = 4;
    y_init = 1; y_last = 4;
    rand_lowest = -50;
    rand_highest = 50;

function GenerateMatrix: array[y_init..y_last, x_init..x_last] of integer;
var
    x, y: integer;
    matrix: array[y_init..y_last, x_init..x_last] of integer;
begin
    Randomize;
    for y := y_init to y_last do
        for x := x_init to x_last do
            matrix[y, x] :=
                Random(rand_highest - rand_lowest + 1) + rand_lowest;
    GenerateMatrix := matrix;
end;

function GetSortedMatrix(
    matrix: array[y_init..y_last, x_init..x_last] of integer
    ): array[y_init..y_last, x_init..x_last] of integer;
var
    x_outer, y_outer, x_inner, y_inner, x_min, y_min: integer;
    value_min: integer;
begin
    for x_outer := x_init to x_last do
        for y_outer := y_last downto y_init do
        begin
            x_min := x_outer;
            y_min := y_outer;
            value_min := matrix[y_outer, x_outer];
            x_inner := x_outer;
            y_inner := y_outer - 1;
            if y_inner < y_init then
            begin
                y_inner := y_last;
                inc(x_inner);
                if x_inner > x_last then break;
            end;
            repeat
            begin
                repeat
                begin
                    if value_min > matrix[y_inner, x_inner] then
                    begin
                        x_min := x_inner;
                        y_min := y_inner;
                        value_min := matrix[y_inner, x_inner];
                    end;
                    dec(y_inner);
                end;
                until y_inner < y_init;
                y_inner := y_last;
                inc(x_inner);
            end;
            until x_inner > x_last;
            matrix[y_min, x_min] := matrix[y_outer, x_outer];
            matrix[y_outer, x_outer] := value_min;
        end;
    GetSortedMatrix := matrix;
end;

procedure PrintMatrix(
    matrix: array[y_init..y_last, x_init..x_last] of integer);
var
    x, y: integer;
begin
    writeln;
    for y := y_init to y_last do
    begin
        for x := x_init to x_last do
            write(matrix[y, x] : 4, ' ');
        writeln;
    end;
end;

// Main
var
    matrix1, matrix2: array[y_init..y_last, x_init..x_last] of integer;
begin
    writeln;
    matrix1 := GenerateMatrix;
    write('Generated matrix:');
    PrintMatrix(matrix1);
    writeln;
    matrix2 := GetSortedMatrix(matrix1);
    write('Sorted matrix:');
    PrintMatrix(matrix2);
    writeln;
end.

Результат виконання:

Generated matrix:
 -37  -46  -42  -18 
 -12   18  -15    7 
   9  -34   25   -4 
  45    1   41    8 

Sorted matrix:
 -34   -4    9   45 
 -37  -12    8   41 
 -42  -15    7   25 
 -46  -18    1   18