- •1.Побудова і аналіз алгоритмів
- •1.1.Формалізація алгоритмів.
- •1.2.Покрокове проектування алгоритмів.
- •1.3.Характеристики алгоритму
- •1.4.Складність алгоритму
- •1.5.Ефективність алгоритмів
- •1.6.Правила аналізу складності алгоритмів.
- •2.Алгоритми сортування
- •2.1.Задача сортування
- •2.2.Сортування вибіркою
- •2.2.1.Сортування простою вибіркою
- •2.2.2.Обмінне сортування простою вибіркою
- •2.2.3.Бульбашкове сортування
- •2.2.4.Сортування Шелла
- •2.3.Сортування включенням
- •2.3.1.Сортування простим включенням
- •2.3.2.Бульбашкове сортування включенням
- •2.3.3.Турнірне сортування
- •2.3.4.Сортування впорядкованим бінарним деревом
- •2.3.5.Сортування частково впорядкованим деревом
- •2.4.Сортування розподілом
- •2.4.1.Порозрядне цифрове сортування
- •2.4.2.Швидке сортування Хоара
- •2.5.Сортування злиттям
- •2.5.1.Сортування попарним злиттям
- •2.6.Рандомізація
- •3.Алгоритми пошуку
- •3.1.Послідовний (лінійний) пошук
- •3.2.Бінарний пошук
- •3.3.Метод інтерполяції
- •3.4.Метод „золотого перерізу”
- •3.5.Алгоритми пошуку послідовностей
- •3.5.1.Прямий алгоритм пошуку
- •3.5.2.Алгоритм Кнута, Моріса, Пратта
- •3.5.3.Алгоритм Боуєра та Мура
- •4.Методи швидкого доступу до даних
- •4.1.Хешування даних
- •4.1.1.Методи розв’язання колізій
- •4.1.2.Переповнення таблиці і повторне хешування
- •4.1.3.Оцінка якості хеш-функції
- •4.2.Організація даних для прискорення пошуку за вторинними ключами
- •4.2.1.Інвертовані індекси
- •4.2.2.Бітові карти
- •5.Мережеві алгоритми
- •5.1.Представлення мереж
- •5.2.Операції з вузлами і зв’язками
- •5.2.1.Обхід мережі
- •5.2.2.Найменші стовбурні дерева
- •5.3.Найкоротший маршрут
- •5.3.1.Інші задачі пошуку найкоротшого маршруту
- •5.3.1.1.Двох-точковий найкоротший маршрут
- •5.3.1.2.Обчислення найкоротшого маршруту для всіх пар
- •5.3.1.3.Штрафи за повороти
- •5.3.2.Застосування методу пошуку найкоротшого маршруту
- •5.3.2.1.Розбиття на райони
- •5.3.2.2.Складання плану робіт
- •5.3.2.3.Планування колективної роботи
- •5.4.Максимальний потік
- •5.4.1.Застосування максимальних потоків
- •5.4.1.1.Непересічні шляхи
- •5.4.1.2.Розподіл робіт
- •6.Методи розробки алгоритмів
- •6.1.Метод частинних цілей
- •6.2.Динамічне програмування
- •6.3.Метод сходження
- •6.4.Дерева розв’язків
- •6.4.1.Мінімаксний пошук
- •6.4.2.Покращення пошуку в дереві гри
- •6.4.3.Метод відпрацювання назад
- •6.5.Програмування з поверненнями назад
- •6.5.1.Метод спроб та помилок
- •6.5.2.Реалізація пошуку з поверненням
- •6.5.3.Альфа-бета відсікання
- •6.5.4.Метод гілок і границь
- •6.6.Евристичні алгоритми
- •6.7.Імовірнісні алгоритми
- •6.8.Генетичні алгоритми
- •6.8.1.Розв’язок діофантового рівняння.
- •6.8.2.Програмна реалізація
2.2.3.Бульбашкове сортування
При перегляді вхідної множини попарно порівнюються сусідні елементи множини. Якщо порядок їхнього проходження не відповідає заданому критерію впорядкованості, то елементи міняються місцями. В результаті одного такого перегляду при сортуванні за збільшенням елементів елемент з найбільшим значенням ключа переміститься („спливе”) на останнє місце в множині. При наступному проході на своє місце „спливе” другий за величиною ключа елемент і т.д. Для постановки на свої місця N елементів слід зробити N-1 проходів. Вихідна множина, таким чином, формується в кінці сортованої послідовності, при кожному наступному проході його об’єм збільшується на 1, а об’єм вхідної множини зменшується на 1.
void Sort(int *a)
{
int k, i;
for ( k=N; k>1; k-- )
// „Всплиття” чергового максимального елемента на k-ту позицію
for ( i=1; i<k; i++ )
if ( a[i-1] > a[i] )
Swap(a[i-1], a[i]);
}
Порядок сортування бульбашкою – . Середнє число порівнянь – N*(N-1)/2 і таке ж середнє число перестановок, що значно гірше, ніж для обмінного сортування простим вибором. Проте, та обставина, що тут завжди порівнюються і переміщаються тільки сусідні елементи, робить сортування бульбашкою зручним для обробки зв’язних списків. Перестановка в зв’язних списках також виходить більш економною.
Ще одна перевага сортування бульбашкою полягає в тому, що при незначних модифікаціях її можна зробити чутливою до початкової впорядкованості вхідної множини.
По-перше, можна ввести деяку логічну змінну, яка буде скидатися в false перед початком кожного проходу і встановлюватися в true при будь-якій перестановці. Якщо після закінчення проходу значення цієї змінної залишиться false, це означає, що міняти місцями більше немає нічого, сортування закінчено. При такій модифікації при попаданні на вхід алгоритму вже впорядкованої множини алгоритм виконає тільки один перегляд.
По-друге, можна враховано ту обставину, що за один перегляд вхідної множини на своє місце можуть „сплисти” не один, а два і більше елементів. Це легко врахувати, запам’ятовуючи при кожному перегляді позицію останньої перестановки і установки цієї позиції в якості межі між множинами для наступного перегляду. Саме ця модифікація реалізована в програмній ілюстрації сортуванню бульбашкою в наступному прикладі. Змінна nn при кожному проході встановлює верхню межу вхідної множини. В змінній х запам’ятовується позиція перестановок і в кінці перегляду останнє значення, що запам’яталось, заноситься в nn. Сортування буде закінчено, коли верхня межа вхідної множини стане рівною 0.
void Sort(int *a)
{
int nn, i, x;
nn = N; // межа вхідної множини
do
{
x = 0; // ознака перестановок
for ( i=1; i<nn; i++ ) // перебір вхідної множини
if ( a[i-1] > a[i] ) // порівняння сусідніх елементів
{
Swap(a[i-1], a[i]); // перестановка
x = i; // запам'ятовування позиції
}
nn = x; // зсув межі
}
while (nn>0); // цикл поки вих. множина не захопить весь масив
}
Ще одна модифікація сортування бульбашкою носить назву шейкер-сортування. Суть її полягає в тому, що напрями переглядів чергують: за проходом до кінця множини слідує прохід від кінця до початку вхідної множини. При перегляді в прямому напрямку запис з найбільшим ключем ставиться на своє місце в послідовності, при перегляді у зворотному напрямі – запис з самим меншим. Цей алгоритм досить ефективний для задач відновлення впорядкованості, коли початкова послідовність вже була впорядкована, але піддалася не дуже значним змінам. Впорядкованість в послідовності з одиночною зміною буде гарантовано відновлена усього за два проходи.