1

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

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

Post's attachments

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

2

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

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

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

3

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

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

4

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

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

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

5

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

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

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

6

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

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

7

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

Для початку - ви ж розумієте, що сортувати двовимірний масив неможливо, сортування передбачає переставляння елементів по порядку вздовж однієї вісі координат. Тобто нам треба якось розташувати елемент вздовж однієї лінії.
Тепер - два варіанти, обирайте, який зрозуміліше.
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: Паскаль-Сортування_HElP

koala написав:

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

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

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

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

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

9

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

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

10

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

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: Паскаль-Сортування_HElP

podolets98 написав:

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

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

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

12

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

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

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

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

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

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

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

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

koala написав:

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

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

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

14

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

*JOKINGLY*

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

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

На прохання користувача 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