Тема: Паскаль Сортування
Задану прямокутну матрицю відсортувати методом вибору так, щоб послідовність елементів була такою, як зображено на схемі: перший та останній елемент поміняти місцями.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Паскаль Сортування
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Задану прямокутну матрицю відсортувати методом вибору так, щоб послідовність елементів була такою, як зображено на схемі: перший та останній елемент поміняти місцями.
А батьки вас і прохати не навчили?
Втім, це все не має значення. Ви або робите самі, а ми допомагаємо із тим, що не виходить (якщо у вас не виходь взагалі нічого, спробуйте почитати підручник); або пропонуєте гроші. Більше варіантів тут нема.
podolets98
Ви уже пробували робити це завдання самостійно? Із чим саме виникли труднощі? Може компілятор якусь помилку видає?
Якщо ви дійсно нічого не хочете робити самі, то тему варто перенести в розділ Пропоную роботу.
Виникає проблема в самому сортуванні як відсортувати масив як зображено на малюнку, не розумію як виконати таке сортування, мені потрібна частина коду сортування або пояснення як це зробити.
Для початку - ви ж розумієте, що сортувати двовимірний масив неможливо, сортування передбачає переставляння елементів по порядку вздовж однієї вісі координат. Тобто нам треба якось розташувати елемент вздовж однієї лінії.
Тепер - два варіанти, обирайте, який зрозуміліше.
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 і пара додавань-віднімань. А потім записуємо будь-який алгоритм сортування з заміною координат.
... сортувати двовимірний масив неможливо ...
Це спірне питання.
Можна чи не можна часто визначається не тільки тим що саме ми сортуємо, але й критерієм впорядкованості.
На скільки я пам'ятаю, сортування - це процес впорядкування елементів послідовності, після якого кожна пара елементів послідовності задовольняє певному критерію.
Наприклад для сортування послідовності дійсних чисел по замовчуванню критерій буде наступним:
Пара чисел (X[і], X[j]), які належать даній послідовності, є впорядкованою, якщо виконується умова:
((i<j)&&(X[і]<=X[j]))||((i>j)&&(X[і]>=X[j]))||(i==j)
Матрицю також можна розглядати як послідовність, але потрібен чіткий критерій впорядкованості.
Припускаю, що podolets98 не може відсортувати матрицю, бо не знає цього критерію.
І я допомогти не зможу, бо для мене картинка ні про що не говорить.
podolets98, якщо це завдання Вам дав викладач, то запитайте його за яким критерієм Ви маєте відсортувати елементи матриці.
Для початку - ви ж розумієте, що сортувати двовимірний масив неможливо, сортування передбачає переставляння елементів по порядку вздовж однієї вісі координат. Тобто нам треба якось розташувати елемент вздовж однієї лінії.
Тепер - два варіанти, обирайте, який зрозуміліше.
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 і пара додавань-віднімань. А потім записуємо будь-який алгоритм сортування з заміною координат.
Сортуючи кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема
Сортуючи кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема
Прочитайте те, що я написав, ще один-два рази. Я б сказав "до просвітлення", але не певен, що воно наступить. Зверніть увагу у першому варіанті, що змінюються 2 координати.
podolets98 написав:Сортуючи кожний стовпець послідовність не буде такою яка зображена на малюнку оскільки кожний стовпець буде відсортований окремо і послідовність чисел буде не послідовною, в цьому і проблема
Прочитайте те, що я написав, ще один-два рази. Я б сказав "до просвітлення", але не певен, що воно наступить. Зверніть увагу у першому варіанті, що змінюються 2 координати.
Вдячний, так справді я прочитав і прийшло декілька варіантів вирішення!
Пане leofun01, там малюнок є в автора.
Так, я бачив малюнок і для мене завдання залишилося не однозначним.
Думаю, Ваша відповідь є саме тим, що було потрібно автору теми.
На прохання користувача 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
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися