
- •1. Сортування
- •1.1. Сортування масивів
- •1. Сортування простими включеннями;
- •2. Сортування простим вибором;
- •1.1.1. Сортування простими включеннями
- •1.1.2. Сортування простим вибором
- •1.1.3. Сортування простим обміном (засіб “бульбашки”)
- •1.1.4. Шейкер-сортування
- •1.1.5. Швидке сортування
- •1.2. Сортування масива рядків
- •1.3. Сортування файлів
- •2. Рекурсивні алгоритми
- •2.1. Алгоритми з поверненням
- •2.1.1. Шахова задача про хід коня
- •2.1.2. Шахова задача про вісім ферзів
- •3. Динамічні інформаційні структури
- •3.1. Динамічні змінні. Вказівники
- •3.1.1. Засоби створення та використання динамічних даних
- •3.2. Рекурсивні типи даних
- •3.3. Списки
- •3.3.2. Двозв’язні та кiльцевi списки
- •3.3.3. Черги і стеки
- •3.4. Деревовидні структури
- •3.4.1. Бінарні дерева
- •3.4.2. Ідеально збалансовані дерева
- •3.4.3. Дерева пошуку
- •3.4.4. Збалансовані дерева (авл-дерева)
- •4. Завдання до лабораторних та контрольних робіт.
- •4.1. Сортування.
- •4.2. Списки.
1.1.5. Швидке сортування
Алгоритм сортування:
Вибирається елемент x приблизно посередині. Переглядається масив зліва направо, поки не зустрінеться елемент a[i]>x, а потім справа наліво, поки не зустрінеться елемент a[j]<x. Елементи a[i] та a[j] міняються місцями, поки i та j не зустрінуться.
-
55 12 42 94 06 18 67
18 06 12 42 94 55 44 67
В результаті ми отримали два підмасиви: зліва елементи з меншими ключами, справа — з більшими відносно елемента з ключем 42.
a[k].key <= x.key для k=1,...,i–1 a[k].key >= x.key для k=j+1,...,n
Тепер необхідно зробити те саме з обома отриманими частинами масиву, частинами частин і т.д., поки кожна частина не буде містити в собі тільки один елемент.
Procedure QuickSort;
Procedure Sort (left, right: index);
Var
i,j : index;
x,w : item;
Begin
i:=left;
j:=right;
x:=a[(left+right) div 2];
Repeat
While a[i].key < x.key Do i:=i+1;
While a[j].key > x.key Do j:=j–1;
If i<=j Then
Begin
w:=a[j];
a[i]:=a[j];
a[j]:=w;
i:=i+1;
j:=j–1
End
Until i>j;
If left<j Then Sort(left,j);
If i<right Then Sort(i,right)
End;
Begin
Sort(1,n);
End;
Цей алгоритм дуже простий та ефективний, часто використовується професійними програмістами.
Міра ефективності алгоритму визначається в результаті підрахування кількості необхідних порівнянь ключів та пересилань елементів, що визначає швидкодійність методу.
При розробці технологічних процесів обробки великих об’ємів інформації необхідно враховувати, що найбільш ефективні методи пошуку працюють тільки на впорядкованих наборах даних. Якщо передбачається пошук у великому наборі даних, цей набір необхідно спочатку відсортувати.
1.2. Сортування масива рядків
Сортування рядків — це впорядкування даних рядкового типу за алфавітом (фактично за номером символів, що складають рядок, у кодовій таблиці). Сортування рядків виконується при виведенні списків (за прізвищами, за назвами), імен файлів при роботі з директорієм і т.ін.
Порівняння рядків здійснюється зліва направо до першого незбіжного символу, і той рядок вважають більшим, в якому перший незбіжний символ має більший номер у стандартній таблиці кодів:
‘Іванчук’ > ’Іванченко’
З двох збіжних за символами рядків різної довжини меншим є коротший: ’ABR’ < ’ABRAKAD’
Розглянемо приклад. У прикладі дані вводяться з клавіатури, але на практиці краще дані зберігати у файлі на диску.
Для сортування використовуємо метод швидкого сортування.
Процедура сортування рядкiв має вигляд:
Procedure SortString (Var inm:StringArray; n:Integer);
{StringArray – масив рядків, n– кількість рядків}
Procedure InSort (left,right:Integer; Var m:StringArray);
Var
a,b : InData;
i,j : Integer;
Begin
i:=left;
j:=right;
a:= m[(left + right) div 2];
Repeat
While m[i] < a Do i:=i+1;
While a < m[j] Do j:=j–1;
If i<=j Then
Begin
b:=m[i];
m[i]:=m[j];
m[j]:=b;
i:=i+1;
j:=j–1
End
Until i>j;
If left<j Then InSort (left,j,m);
If i<right Then InSort (i,right,m);
End;
Begin
InSort (1,n,inm);
End;