- •Теоретичні основи програмування
- •1. Комбінаторні алгоритми обробки структур даних. Задачі пошуку та сортування.
- •2. Алгоритми пошуку елемента в масиві за даними критеріями. Прямий і бінарний пошук.
- •3. Алгоритми пошуку підпослідовності в послідовності. Прямий пошук підрядка в рядку. Алгоритм Кнута – Моріса – Пратта.
- •Прямий пошук підрядка в рядку.
- •Метод Кнута-Моріса-Пратта.
- •4. Прямі алгоритми сортування масивів. Алгоритм сортування прямим включення, прямим вибором, прямим обміном. Шейкерне сортування масивів.
- •Сортування прямим включенням.
- •Сортування прямим обміном.
- •Шейкерне сортування.
- •5. Швидкі алгоритми сортування масивів. Алгоритм Шелла, Quick Sort, Heap Sort. Сортування включенням із зменшуваними відстаннями - алгоритм Шелла (1959).
- •Сортування обміном на великих відстанях - алгоритм Quick Sort.
- •Сортування вибором при допомозі дерева - алгоритм Heap Sort.
- •6. Сортування структур даних з послідовним доступом. Алгоритми злиття.
4. Прямі алгоритми сортування масивів. Алгоритм сортування прямим включення, прямим вибором, прямим обміном. Шейкерне сортування масивів.
Сортування слід розуміти як процес перегрупування заданої множини об’єктів в деякому конкретному порядку. Ціль сортування – полегшити наступний пошук елементів в такій відсортованій множині.
Сортування прямим включенням.
В основі даного методу лежить пошук для чергового елемента масиву відповідного місця у відсортованій частині із наступним включенням його в знайдену позицію. Таким чином елементи масиву умовно діляться на дві групи – вже «готову» а1,а2, …, аі та вихідну послідовність. На кожному етапі, починаючи з і=2 та збільшуючи і кожен раз на 1, із вихідної послідовності вибирається один елемент і вставляється в потрібне місце у вже впорядковану послідовність. Очевидно, що початково ліва послідовність буде "готовою", оскільки одноелементний масив завжди впорядкований. Цей алгоритм можна записати у вигляді послідовності команд :
for i:=2 to N do
begin
X:=a[i]; (включечння_Х_на_потрібне_місце_серед а[1],...,a[i])
end ;
Процес просіювання (пошуку потрібного місця для включення елемента х) може припинитися при виконанні однієї із двох умов :
- знайдено елемент з ключем, меншим ніж ключ у х ;
- досягнутий лівий кінець "готової" послідовності.
Таким чином програмна реалізація методу прямого включення матиме вигляд процедури :
Procedure Straight_Insertion;
var i,j:integer; x:basetype;
Begin
for i:=2 to N do
begin x:=a[i]; a[0]:=x; j:=i;
while x<a[j-1] do
begin
a[j]:=a[j-1]; j:=j-1
end; a[j]:=x
end
end;
Сортування прямим вибором.
На відміну від включення, коли для чергового елемента відшукувалося відповідне місце в «готовій» послідовності, в основу цього методу покладено вибір відповідного елемента для певної позиції в масиві. Цей прийом базується на таких принципах:
1) на і-ому етапі серед елементів а1, а2,...аN вибирається елемент з найменшим ключем amin;
2) проводиться обмін місцями аmin та а1.
Процес послідовного вибору і перестановки проводиться поки не залишиться один єдиний елемент - з самим найбільшим ключем.
Такий алгоритм можна записати у вигляді послідовності команд :
for i:=1 to N-1 do
begin
k:=номер_найменшого_ключа_серед а[і],...,a[N]; обмін місцями a[k] та а[і] end;
А програмна реалізація методу прямого вибору матиме вигляд процедури:
Procedure Straight_Selection;
var i,j,k:integer; x:basetype;
Begin for i:=1 to N-1 do begin k:=1; for j:=i+1 to N do
if a[j]<a[k] then k:=j; x:=a[k]; a[k]:=a[i]; a[i]:=x end end;
Сортування прямим обміном.
Даний метод базується на повторенні етапів порівняння сусідніх ключів при русі вздовж масиву. Якщо наступний елемент виявиться меншим від попереднього, то відбувається обмін (звідси і назва методу). Таким чином, при русі з права наліво за один етап найменший ключ переноситься на початок масиву. Зрозуміло, що кожен наступний прохід можна закінчувати після позиції знайденого на попередньому етапі мінімального елемента, оскільки всі елементи перед ним вже впорядковані. Розглядуваний процес дещо нагадує виштовхування силою Архімеда бульбашки повітря у воді. Тому цей алгоритм ще називають "бульбашковим" сортуванням.
Програмна реалізація методу прямого обміну або "бульбашки" матиме вигляд процедури:
Procedure Buble_Sort;
var i,j:integer; x:basetype;
Begin
for i:=2 to N do
for j:=N downto i do
if a[j-1]>a[j] then
begin x:=a[j]; a[j]:=a[j-1]; a[j-1]:=x end end;
Якщо етапи порівняння та обміну проводити зліва направо, то відбуватиметься виштовхування найбільшого елемента в кінець масиву. Очевидно такий процес відповідає опусканню під дією сили тяжіння камінця у воді. Назвемо цей алгоритм "камінцевим" сортуванням:
Procedure Stone_Sort;
var i,j:integer; x:basetype;
Begin for i:=1 to N-1 do
for j:=1 to N-i do
if a[j-1]>a[j] then
begin x:=a[j]; a[j]:=a[j-1]; a[j-1]:=x end end;
