
- •Програмування
- •1. Алгоритми 12
- •2. Комп’ютери і програми 47
- •3. Мова програмування паскаль 56
- •4. Прості типи даних. Лінійні програми 61
- •5. Процедурне програмування 73
- •6. Програмування розгалужень 79
- •7. Оператори повторення з параметром. Масиви 99
- •7.13. Задачі і вправи 114
- •8. Ітераційні цикли 116
- •8.6. Задачі і вправи 124
- •9. Рекурсія 126
- •9.4. Задачі і вправи 135
- •10. Швидкі алгоритми сортування і пошуку 137
- •10.8. Задачі і вправи 148
- •11. Складні типи даних: записи і файли 150
- •11.11. Задачі і вправи 169
- •12. Множини 172
- •12.5. Задачі і вправи 175
- •13. Динамічні структури даних 176
- •14. Методологія структурного програмування: підсумки 192
- •1. Алгоритми
- •1.1. Змістовне поняття алгоритму
- •1.2. Виконавець алгоритмів і його система команд
- •1.3. Основні властивості алгоритмів
- •1.4. Величини
- •1.5. Типи величин
- •1.6. Цілі числа
- •1.7. Дійсні числа
- •1.8. Рядкові величини
- •У слові w знайти слово p і замінити його словом q.
- •1.9. Форми запису алгоритмів
- •1:Кінець.
- •X2 присвоїти значення x1
- •1:Кінець.
- •1.10. Команди управління
- •1.11. Блок - схеми
- •1.12. Допоміжні алгоритми
- •1.13. Базові структури управління
- •1.14. Абстракція даних
- •Приклад 1.7. Атд Планіметрія (виконавець Геометр)
- •1.15. Структурне програмування
- •1.16. Парадигма процедурного програмування
- •2. Комп’ютери і програми
- •2.1. Комп’ютер як універсальний Виконавець
- •2.1.1. Зовнішні пристрої комп’ютера
- •2.1.2. Центральні пристрої комп’ютера
- •2.1.3. Поняття про машинну мову
- •2.2. Мови програмування високого рівня
- •2.2.1. Коротка історія розвитку мов програмування
- •2.2.2. Про історію розвитку методів проектування програм
- •2.3. Основні етапи проектування програми
- •2.4. Технологія трансляції програм
- •2.5. Поняття про систему програмування
- •3. Мова програмування паскаль
- •3.1. Алфавіт мови
- •3.2. Концепція даних
- •3.3. Імена та їх застосування
- •3.4. Структура Pascal-програми
- •3.5. Поняття про лексику, прагматику, синтаксис і семантику мови програмування
- •3.6. Синтаксичні діаграми як засіб визначення мови програмування
- •4. Прості типи даних. Лінійні програми
- •4.1. Заголовок програми
- •4.2. Константи і їх використання. Розділ констант
- •4.3. Змінні програми. Розділ змінних
- •4.4. Стандартні прості типи даних
- •4.5. Тип даних Integer
- •4.6. Тип даних Real
- •4.7. Тип даних Сhar
- •4.8. Поняття виразу. Значення виразу. Тип виразу
- •4.9. Розділ операторів. Оператор присвоювання
- •4.10. Оператори введення - виведення
- •4.11. Приклад лінійної програми
- •4.12. Поняття складності виразу. Оптимізація обчислень
- •4.13. Оптимізація лінійних програм
- •4.14. Задачі і вправи
- •5. Процедурне програмування
- •5.1. Опис процедури
- •5.2. Формальні параметри. Локальні і глобальні об’єкти
- •5.3. Оператор процедури. Фактичні параметри
- •5.4. Функції
- •5.5. Приклади
- •6. Програмування розгалужень
- •6.1. Поняття умови. Тип даних Boolean (логічний)
- •6.2. Складений оператор
- •6.3. Оператори вибору: умовний оператор
- •6.4. Приклади
- •6.5. Задачі вибору й упорядкування
- •6.5.1. Задачі вибору
- •6.5.2. Дерево розв’язувань задачі вибору
- •6.5.3. Задачі на зважування
- •6.5.4. Ефективність алгоритму як кількість його кроків
- •6.5.5. Вибір даного елемента
- •6.6. Задачі упорядкування
- •6.6.1. Упорядкування елементів
- •6.6.2. Порівняння, перестановки і пересилання
- •6.7. Оптимізація розгалужень
- •6.8. Розділ типів. Перелічуваний тип
- •6.9. Оператори вибору: оператор варіанта
- •6.10. Вправи
- •7. Оператори повторення з параметром. Масиви
- •7.1. Оператор циклу з параметром
- •7.2. Циклічні програми. Складність циклічної програми. Оптимізація циклічних програм
- •7.3. Обмежені типи
- •7.4. Складні (складені) типи
- •7.5. Регулярний тип. Масиви
- •7.6. Пошук елемента в масиві
- •7.7. Ефективність алгоритму за часом
- •7.8. Мітки. Оператор переходу. Застосування оператора переходу для дострокового виходу з циклу
- •7.9. Постановка задачі сортування
- •7.10. Сортування масивів
- •7.10.1. Прості алгоритми сортування
- •7.11 Сортування обмінами
- •7.12. Сортування вибором
- •7.13. Задачі і вправи
- •8. Ітераційні цикли
- •8.1. Оператори повторення While і Repeat
- •8.2. Алгоритми пошуку і сортування. Лінійний пошук у масиві
- •8.3. Поліпшений алгоритм сортування обмінами
- •8.4. Бінарний пошук в упорядкованому масиві
- •8.5. Алгоритми сортування масивів (продовження). Сортування вставками
- •8.5.1 * Ефективність алгоритму
- •8.6. Задачі і вправи
- •9. Рекурсія
- •9.1. Рекурсивно-визначені процедури і функції
- •9.2. Приклади рекурсивних описів процедур і функцій
- •I стержень j стержень 6-I-j стержень
- •I стержень j стержень 6-I-j стержень
- •I стержень j стержень 6-I-j стержень
- •9.3. Переваги і недоліки рекурсивних алгоритмів
- •9.4. Задачі і вправи
- •10. Швидкі алгоритми сортування і пошуку
- •10.1. Нижня оцінка часу задачі сортування масиву за числом порівнянь
- •10.2. Швидкі алгоритми сортування: Сортування деревом
- •10.2.1. *Аналіз складності алгоритму
- •10.3. Пірамідальне сортування
- •10.3.1.*Аналіз складності алгоритму
- •10.4. Швидке сортування Хоара
- •10.5. Пошук k-того в масиві. Пошук медіани масиву
- •10.6.* Метод “розділяй і володій”
- •10.7.* Метод цифрового сортування
- •10.8. Задачі і вправи
- •11. Складні типи даних: записи і файли
- •11.1. Складні типи даних у мові Pascal
- •11.2. Записи
- •11.3. Записи з варіантами
- •11.4. Оператор приєднання
- •11.5. Рядки і засоби їх обробки
- •Процедури і функції типу String.
- •11.7. Файли. Управління файлами
- •11.8. Основні задачі обробки файлів
- •11.9. Сортування файлів
- •11.9.1. Алгоритм сортування злиттям
- •11.9.2. Аналіз складності алгоритму
- •11.10. Задача корегування файла
- •11.11. Задачі і вправи
- •12. Множини
- •12.1. Множинний тип
- •12.2. Конструктор множини
- •12.3. Операції і відношення над множинами
- •12.4. Застосування множин у програмуванні
- •12.5. Задачі і вправи
- •13. Динамічні структури даних
- •13.1. Стандартні динамічні структури
- •13.2. Посилальний тип даних. Посилання
- •13.3. Програмування динамічних структур даних
- •13.4. Стеки, списки, черги
- •13.5. Задачі
- •13.6. Дерева
- •13.7. Бінарні дерева
- •13.8. Задачі
- •14. Методологія структурного програмування: підсумки
- •14.1. Основні структури управління
- •14.2. Основні структури даних
- •14.3. Методологія програмування “зверху-вниз”
- •14.4. Приклад: Система лінійних рівнянь
- •14.5. Проектування модулів. Модуль rat
- •14.6. Реалізація модуля
- •14.7. Висновки (модульне програмування)
- •14.8. Заключне зауваження: переходимо до об’єктів
7.9. Постановка задачі сортування
Під сортуванням послідовності розуміють процес перестановки елементів послідовності у визначеному порядку. Мета такої впорядкованості – полегшення подальшої обробки даних (зокрема, задачі пошуку). Тому задача сортування – одна з найбільш важливих внутрішніх задач програмування.
Цікаво, що задача сортування є ідеальним прикладом великої кількості різноманітних алгоритмів, розв’язування одної й тієї ж задачі. Розглядаючи різні методи сортування, ми побачимо, як зміна алгоритму приводить до нових, більш ефективних у порівнянні з простими, розв’язувань задачі сортування.
Нехай дана послідовність елементів a1, a2, ... , an. Елементи цієї послідовності – дані довільного типу, на якому визначено відношення порядку “<<” (менше) таке, що будь-які два різні елементи можна порівняти.
Сортування означає перестановку елементів послідовності ak1, ak2, ... , akn таку, що ak1 << ak2 << ... << akn.
Приклад: послідовність документів, кожний з яких містить інформацію про людину, включаючи його вік. Потрібно розмістити документи цієї послідовності у порядку за віком, починаючи зі старшого.
7.10. Сортування масивів
Якщо послідовність a1, a2, ... , an реалізована як масив a[1..n], вся вона розміщена в адресованій пам’яті. Тому наряду з вимогами ефективності за часом основна вимога – економне використання пам’яті. Це означає, що алгоритм не повинен використовувати додаткові масиви і пересилання з масиву а в ці масиви.
Постановка задачі сортування в загальному виді передбачає, що існують тільки два типи дій з даними сортованого типу: порівняння двох елементів (x << y) і пересилання елемента (x := y). Тому зручна міра складності алгоритму сортування масиву a[1..n] за часом - кількість порівнянь C(n) і кількість пересилань M(n).
7.10.1. Прості алгоритми сортування
Прості алгоритми сортування можна класифікувати як сортування обміном, сортування вибором і сортування включеннями.
7.11 Сортування обмінами
Основна дія сортування обмінами – порівняння двох елементів і, якщо результат порівняння негативний, перестановка їх місцями:
Якщо при i < j a[i] > a[j] то переставити a[i] і a[j].
В найбільш простому варіанті порівнюються елементи a[j] і a[j+1], що стоять поряд:
Приклад 7.9.
Const
n = 100;
Type
Vector = array[1..n] of Real;
Procedure BublSort(Var a: Vector);
Var
i, j : Integer;
TempMem : Real;
Begin
For i := n - 1 downto 1 do
For j := 1 to i do
If a[j] > a[j+1]
then begin
TempMem := a[j+1];
a[j+1] := a[j];
a[j] := TempMem
end;
End;
Аналіз алгоритму сортування обмінами.
Аналіз алгоритму полягає в обґрунтуванні його властивостей. Важливішими властивостями алгоритму є: коректність (правильність), оцінка складності за часом та пам’яттю, а також деякі інші властивості.
Для обґрунтування алгоритму сортування необхідно довести, що алгоритм завжди (незалежно від входу) завершує свою роботу і його результат – впорядкований за зростанням масив. Оцінка складності (ефективності) алгоритму за часом полягає у находженні C(n), M(n) у гіршому випадку, у середньому.
Оскільки алгоритм сортує масив “на місці”, його складність за пам’яттю – константа.
До інших властивостей алгоритму можна віднести властивість стійкості. (Алгоритм сортування називається стійким, якщо він не переставляє місцями тотожні елементи.) Здійснимо аналіз алгоритму сортування обмінами.
Завершуваність.
Алгоритм BublSort завжди завершує свою роботу, оскільки він використовує тільки цикли з параметром, і в тілі циклів параметри примусово не змінюються.
Коректність.
Внутрішній цикл алгоритму (з параметром j) здійснює послідовний перегляд перших і елементів масиву. На кожному кроці перегляду порівнюються і, якщо це необхідно, переставляються два сусідніх елемента. Таким чином, найбільший серед перших і +1 елементів “ спливає ” на ( і + 1 )-е місце. Тому після виконання оператора If має місце співвідношення:
a[j+1] = Max(a[1], ..., a[i], a[j+1]) (1)
а після завершення циклу (i = j) має місце співвідношення
a[i+1] = Max(a[1], ..., a[i], a[i+1]) (2)
Зовнішній цикл (з параметром і ) керує довжиною частини масиву, що переглядається: вона зменшується на 1. Тому після завершення внутрішнього циклу має місце співвідношення:
a[i+1] a[i+2] ... a[n] (3)
Після завершення зовнішнього циклу отримаємо:
a[1] a[2], a[2] a[3] ... a[n] (4)
тобто масив відсортований.
Відзначимо, що більш докладне обґрунтування складається перш за все в доказі співвідношень (1), (3). Це можна зробити методом математичної індукції.
Ефективність за часом.
Зовнішній цикл виконався n-1 разів. Внутрішній цикл виконується і разів (i = n-1, n-2, ..., 1). Кожне виконання тіла внутрішнього циклу складається з одного порівняння і, можливо, з одної перестановки. Тому
C(n) = 1+2+ ... +n-1 = n*(n - 1)/2, M(n) n*(n - 1)/2.
У гіршому випадку (коли елементи вихідного масиву розміщені в порядку спадання)
C(n) = n*(n - 1)/2 = O(n2), M(n) = n*(n - 1)/2 = O(n2)
Стійкість.
Для доказу стійкості достатньо зауважити, що переставляються тільки сусідні нерівні елементи.