You are on page 1of 3

Лабораторна робота № 12

Алгоритми пошуку і сортування масивів


Мета: вдосконалити навички при написанні функцій для обробки масивів,
засвоїти алгоритми пошуку та сортування масивів, реалізувати їх мовою С++.

МЕТОДИЧНІ ВКАЗІВКИ
Найпоширенішою операцією для масивів є операція пошуку. І очевидно, що здійснювати пошук у
впорядкованому (відсортованому) наборі даних набагато зручніше і швидше. Тому розглянемо алгоритми
для здійснення операцій пошуку і сортування масиву.
Пошук - це процес знаходження серед елементів масиву таких елементів, які задовільняють певні
умови (критерії пошуку). Задане значення критерію пошуку називається ключем пошуку.
Прямий (послідовний) пошук полягає в послідовному перегляді всіх елементів масиву і перевірці
їх на відповідність ключу пошуку. Умовою закінчення пошуку може бути або факт знаходження даного
елемента (пошук успішний), або той факт, що дану сукупність елементів перевірено повністю і не
знайдено елементів, що відповідають критерію пошуку (пошук невдалий).
Цей метод використовується тоді, коли немає ніякої додаткової інформації про масив елементів, в
якому здійснюється пошук.
Приклад коду 1.
// функція послідовного пошуку key в масиві arr[]
bool Search(int arr[], int n, int key)
{
for (int i = 0; i < n; i++)
if (arr[i] == key) return true; // пошук успішний
return false; // пошук невдалий
};
Для послідовного проходження елементів масиву використовується цикл for, в тілі якого є умовний
оператор if для перевірки рівності елементів масиву шуканому елементу key. Якщо ми “натрапили” на
такий елемент, то функція Search() поверне результат true. Якщо ж ми вийдемо з циклу, так і не
“зустрівши” елемент масиву, що рівний key, тоді функція поверне результат false.
Якщо ж потрібно знайти певну інформацію у відсортованому списку, то застосовують бінарний
пошук.
Розглянемо алгоритм бінарного пошуку. Головна ідея алгоритму полягає у тому, щоб розділити
масив на половину і порівняти середній елемент з ключем пошуку. Якщо даний елемент масиву рівний
шуканому, тоді пошук вдалий і можна зупиняти алгоритм. Якщо він (середній елемент) менший від
шуканого, тоді усі елементи зліва від даного включно виключаються з пошуку, тобто далі пошук
продовжується тільки в правій частині. А якщо середній елемент більший за шуканий елемент, то пошук
продовжується тільки в лівій частині. Далі аналогічні дії застосовуються до обраної половини масиву.
Для побудови алгоритму для бінарного пошуку використовують допоміжні змінні bg, end, mid,
які призначені відповідно для індексів першого, останнього і середнього елементів підсписків. Запишемо
спочатку алгоритм.
1. bg=0, end=n-1.
2. mid=(bg+end)/2 (середній елемент).
3. Якщо arr[mid]=key, то пошук вдалий. Кінець алгоритму.
4. Якщо arr[mid]<key, то bg=mid+1, end не змінюється (переходимо на праву частину).
5. Якщо arr[mid]>key, то end=mid-1, bg не змінюється (переходимо у ліву частину).
6. Якщо bg<=end, то переходимо на пункт 2, інакше - пошук невдалий. Кінець алгоритму.
Тепер запишемо реалізацію цього алгоритму.
Приклад коду 2.
// функція бінарного пошуку key в масиві arr[]
bool BinarySearch(int arr[], int n, int key)
{
int bg, end, mid;
bg = 0; end = n - 1;
while (bg <= end)
{
mid = (bg + end) / 2;
if (arr[mid] == key) return true;
if (arr[mid] < key) bg = mid + 1;
if (arr[mid] > key) end = mid - 1;
}
return false;
}
Слід звернути уваги, що бінарний пошук застосовується тільки для відсортованого масиву!
Далі розглянемо методи сортування.
Задача сортування (впорядкування) масиву полягає в розміщенні елементів масиву так, що кожен з
них задовільняє певну умову:
- кожен наступний елемент більший або рівний за попередній (сортування в порядку зростання);
- кожен наступний елемент менший або рівний за попередній (сортування в порядку спадання).
Домовимося, що далі будемо розглядати сортування у порядку зростання (від меншого елементу
до більшого).
Методів сортування є багато, і всі вони дієві. Відрізняються вони своїми алгоритмами і
ефективністю (кількістю порівнянь і перестановок). Всі методи сортування ділять на три групи: обміну,
вибором і вставкою. Кожна з груп має простий метод і вдосконалені методи. Для простоти розуміння і
реалізації ми розглянемо тільки прості методи.
Метод сортування простим обміном (метод “бульбашки”) полягає в наступному: якщо два сусідні
елементи масиву порушують умову сортування, тобто якщо arr[i]<arr[i+1] для випадку зростання, то їх
потрібно поміняти місцями. В результаті першого проходу найбільший елемент масиву стане на своє
місце (“найважча бульбашка впаде на дно”), а найменший посунеться на одну позицію вперед. В
результаті другого проходу другий за величиною елемент стане на своє місце, а найменший ще
просунеться на одну позицію. Тому таких кроків (проходів) потрібно виконувати стільки, поки масив
повністю не впорядкується.
Для обміну елементів arr[i] та arr[i+1] використовуємо таку послідовність операторів:
int temp;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
Тепер реалізуємо весь алгоритм сортування обміном.
Приклад коду 3.
void BubbleSort(int arr[], int n)
{
for (int k = 0; k < n - 1; k++) // цикл по крокам (проходам)
for (int i = 0; i < n - 1; i++) // цикл по елементам масиву
if (arr[i] > arr[i + 1]) // міняємо їх місцями
{
int temp;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}

Розглянемо тепер алгоритм сортування вибором, а саме вибором мінімального елементу. Ідея
методу полягає в наступному: на першому кроці вибирається мінімальний елемент масиву і міняється з
першим елементом; на другому кроці вибирається мнімальний елемент, не враховуючи першого елементу,
і міняється з другим елементом; і так далі.
Напишемо функцію для цього алгоритму.
Приклад коду 4.
void SortSelectMin(int arr[], int n)
{
int min, i_min;
for (int k = 0; k < n - 1; k++) // цикл по крокам
{
min = arr[k]; i_min = k; // починаємо шукати мінімум з arr[k]
for (int i = k+1; i < n; i++)
if (arr[i] < min)
{
min = arr[i];
i_min = i;
}
// міняємо місцями arr[k] з arr[i_min]
int temp = arr[k];
arr[k] = arr[i_min];
arr[i_min] = temp;
}
}

ІНДИВІДУАЛЬНЕ ЗАВДАННЯ

1. Написати функцію сортування обміном у порядку спадання.


2. Написати функцію сортування вибором мінімального елементу у порядку спадання.
3. Написати функцію сортування вибором максимального елементу у порядку зростання.
4. Написати функцію сортування вибором максимального елементу у порядку спадання.

ЗАДАЧІ З ЦІКАВИНКАМИ

1. Написати рекурсивну функцію для бінарного пошуку.


2. Написати функцію сортування обміном методом Шейкера.
3. Написати функцію сортування вставкою у порядку зростання.

ХІД ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ


1. Розглянути всі приклади коду, що є в методичці.
2. Виконати індивідуальне завдання.
3. Оформити звіт.

Звіт повинен містити:


1) тему та мету лабораторної роботи;
2) всі приклади з методички з результатами виконання.
3) індивідуальне завдання згідно варіанту (код програми та результат виконання);
4) висновки.

Звіт з лабораторної роботи оформляється на листах А4 згідно стандартів або відправляється його
електронна версія на moodle.polytech.cv.ua.

You might also like