
- •Методичні вказівки для допомоги студентам у вивченні самостійних тем з предмету
- •Урок № 6
- •Особливості інтегрованого середовища програмування Turbo Pascal. Основні пункти меню
- •Урок № 13
- •Поняття рекурсії. Зовнішні оголошення та оголошення процедур та функцій з випередженням
- •Урок № 14
- •Особливості роботи в текстовому режимі
- •Урок № 20
- •Сортування масиву. Методи сортування масиву
- •Урок № 21
- •Рекурсивне сортування масиву методом вибору
- •Урок № 21
- •Алгоритми роботи з двомірними таблицями на мові програмування Pascal
- •Урок № 25
- •Приклади опису багатомірних масивів засобами мови програмування Pascal
- •Урок № 26
- •Робота з елементами двомірного масиву
- •Урок № 27
- •Записи. Види записів. Робота з записами
- •Урок № 30
- •Множини. Дії над множинами
- •Урок № 32
- •Запис/читання файлу. Маніпуляції вмістом файлу
- •Урок № 33
- •Типізовані файли. Текстові файли. Нетипізовані файли
- •Урок № 37
- •Динамічні данні без внутрішніх посилань
- •Урок № 42
- •Робота з кольорами
- •Урок № 43
- •Робота з координатами
- •Урок № 44
- •Принцип виведення точки та лінії на екран
- •Урок № 45
- •Принцип побудови не заповнених геометричних фігур
- •Урок № 46
- •Принцип побудови заповнених геометричних фігур
- •Урок № 47
- •Виведення тексту в графічному режимі
- •Урок № 50
- •Використання модуля mouse Питання для вивчення:
- •Урок № 51
- •Принципи побудови графічного зображення, що рухається
- •Урок № 52
- •Модуль Graphs3d
Урок № 21
(згідно робочої навчальної програми)
Рекурсивне сортування масиву методом вибору
Питання для вивчення:
Сортування методом простого обміну.
Сортування масиву за допомогою рекурсії.
Сортування методом злиття.
Рекурсивне сортування злиттям
Сортування методом простого обміну. Рекурсивне сортування. Принцип методу: Зліва направо по черзі порівнюються два сусідні елементи, і якщо їх взаємне розташування не відповідає заданій умові впорядкованості, то вони міняються місцями. Далі беруться два наступних сусідніх елемента і так далі до кінця масиву. Після одного такого проходу на останній n-ій позиції масиву буде стояти максимальний (або мінімальний) елемент ("сплив" перший "бульбашка"). Оскільки максимальний (або мінімальний) елемент вже стоїть на своїй останній позиції, то другий прохід обмінів виконується до (n-1)-го елемента. І так далі. Всього потрібно (n-1) прохід.
Процедура, що реалізовує вище розглянутий алгоритм:
Procedure Obmen (Var a: Array1);
Var
i, j, f, g: integer;
Begin
for i: = n downto 2 do
for j: = 1 to i-1 do
if a [j]> a [j +1]
then
begin
f: = a [j];
a [j]: = a [j +1];
a [j +1]: = f;
end;
End;
Сортування масиву за допомогою рекурсії. Алгоритм реалізується наступним чином: в деякому відрізку масиву вибирається центральне (серединне) значення; всі елементи з лівої частини відрізка, що перевершують центральне значення, переміщуються в праву частину, і навпаки. На наступному кроці (для якого використовуються рекурсивні виклики цієї ж процедури) алгоритм повторюється для обох частин відрізка.
Процедура, яка впорядковує по зростанню значення з масиву Massiv в діапазоні індексів Left .. Right.
Procedure QuickSort (Left, Right: integer; Massiv: Array1);
Var
i, j, x, y: integer;
Begin
i: = Left;
j: = Right;
x: = Massiv [(Left + Right) div 2]; {}
repeat
while Massiv [i]
Inc (i);
while Massiv [j]> x do
Dec (j);
if i <= j
then
begin
y: = Massiv [i];
Massiv [i]: = Massiv [j];
Massiv [j]: = y;
Inc (i);
Dec (j);
end;
until i> j;
if Left
then
QuickSort (Left, j);
if i
then
QuickSort (i, Right);
End;
Сортування методом злиття. Цілочисельний масив з розташованими по не зменшенню або по не збільшенню значеннями елементів називається впорядкованим. Використання впорядкованості дозволяє створювати ефективні алгоритми для вирішення багатьох цікавих завдань. Завдання злиття двох вхідних впорядкованих масивів А і В полягає у формуванні упорядкованого вихідного масиву С, містить усі елементи з вхідних масивів. Алгоритм злиття для упорядкованих за не зменшенню масивів. Спочатку елемент А [1] порівнюється з елементом В [1] і найменший з них записується в масив С. Якщо найменшим був А [1], то на наступному кроці порівнюються А [2] і B [1], а якщо найменшим був B [1], то будуть порівнюватися A [1] і B [2] і т.д. Якщо на черговому кроці виявиться, що з одного вхідного масиву всі елементи переписані в С, то переписується елемент з іншого масиву.
Приклад роботи алгоритму злиття. Нехай у масиві А містяться 3 елементи: {5, 13, 14}, а в масиві В - 4 елементи: {7, 9, 10, 12}.Фрагмент рішення задачі на злиття двох масивів А і В, які містять відповідно n1 та n2 елементів. Результуючий масив С буде містити n1 + n2 елементів.
. . .
i1: = 1;
i2: = 1;
for i: = 1 to n1 + n2 do
if i1> n1
then
begin
C [i]: = B [i2];
i2: = i2 +1;
end
else
if i2> n2
then
begin
C [i]: = A [i1];
i1: = i1 +1;
end
else
if A [i1] <= B [i2]
then
begin
C [i]: = A [i1];
i1: = i1 +1;
end
else
begin
C [i]: = B [i2];
i2: = i2 +1;
end;
. . .
Рекурсивне сортування злиттям. Написати програму, що містить алгоритм злиття в процедурі Sort (A, B, b1, e1, e2). Алгоритм повинен копіювати зі злиттям два впорядковані шматка з масиву А з номерами від b1 до e1 і від e1 +1 до e2 відповідно в масив В з номерами елементів від b1 до e2. Алгоритм сортування можна визначити дуже просто:
якщо довжина сортованого масиву 1, то нічого не робиться;
2) в іншому випадку масив ділиться на дві однакові (або майже однакові) частини, до кожної частини застосовується алгоритм сортування, після чого ці впорядковані частині зливаються в один впорядкований шматок.
Процедура сортування злиттям. На вхід процедури сортування надходить неупорядкований шматок масиву А з номерами елементів від b до e, на виході - той же шматок, але впорядкований. Масив С — допоміжний.
Procedure Sort2 (Var A, C: Array1; b, e: integer);
Var
i, d: integer;
Begin
if b
then
begin
d: = (b + e) div 2;
Sort2 (A, C, b, d);
Sort2 (A, C, d +1, e);
Sort (A, C, b, d, e);
for i: = b to e do
A [i]: = C [i]
end;
End
Питання для контролю вивченого матеріалу:
Яким чином відбувається рекурсивне сортування масиву?
Які ще існують методи сортування?
Опрацюйте приклади. Розробіть власну програму сортування масивів.
Література:
Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 190-193