
- •Обчислення часу виконання програми. Правила.
- •Правила аналізу часу виконання алгоритмів.
- •Реалізація атд “Список” при допомозі масивів
- •Реалізація атд “Черга” при допомозі циклічного массиву
- •Оператори для роботи із атд “Множина”. Моделі представлення.
- •Insert(X, a) – робить х елементом множини а. Або іншими словами аè{X}.
- •Реалізація атд “Множина” при допомозі двійкових векторів
- •Реалізація атд “Множина” при допомозі зв’язаних списків
- •Атд “Словник”. Реалізація словників
- •Хешування та хеш-таблиці
- •Тип даних “Дерево”. Основні означення. Обхід дерева в симетричномупорядку
- •Тип даних “Дерево”. Основні означення. Обхід дерева в зворотному орядку
- •Реалізація атд “Дерево” при дпомозі списків синів
- •Функція знаходження опорного елементу та функція перестановки елементів для методу швидкого сортування
- •Пірамідальне сортування.
- •Пошук із використання індексації по ключах
- •Послідовний метод пошуку
- •Метод бінарного пошуку
Функція знаходження опорного елементу та функція перестановки елементів для методу швидкого сортування
Важливим елементом даного сортування є знаходження значення опорного ключа, відносно якого буде проведено перерозподіл елементів масиву.
int findpivot (int i, int j) {
keytype firstkey;
fk = A.key;
for (int k=i+1; k<=j; k++) {
if (A[k].key>firstkey)
return k;
else if (A[k].key<firstkey)
return i; }
return -1;}
Фунkція partition (розділення), яка виконує перестановку елементів і повертає індекс l, що вказує на точку розділення фрагменту масиву A на основі заданого опорного значення pivot, може бути реалізована наступним чином:
int partition (int i, int j, int pivot) {
int l, r;
l = i;
r = j;
do {
swap (A[l],A[r]);
while (A[l].key < pivot)
l++;
while (A[r].key >= pivot)
r--;} while (l<=r);return l;}
Пірамідальне сортування.
Перевагою пірамідального сортування є те, що його час виконання в найгіршому випадку такий же як і в середньому, і має порядок O(nlogn).елемент з найменшим пріоритетом (значенням) є коренем дерева.Проте забравши цей елемент, ми видалимо корінь і тим самим зруйнуємо дерево. Алгоритм пірамідального сортування корисний в тих випадках, коли потрібно не сортувати всі елементи n елементів, а тільки відібрати k найменших елементів з нього, і при цьому kнабагато менше n. В такому випадку, на виконання операції затратиться час порядку O(n).
Для проштовхування нового елементу A[1] (старий A[i]) в пірамідальному сортування використовується функція pushdown:
void pushdown (int first, int last) {
int j;
int r = first;
while (r<=(last/2)) {
if ((2*r==last)||(A[r*2].key<A[2*r+1].key))
j = 2*r;
else
j=2*r+1;
if (A[r].key>A[j].key) {
swap(A[r],A[j]);
r = j; }
else break; }}
Тепер саму функцію сортування можна описати як:
void heapsort (int n) {
// створення частково впорядкованого дерева
for (int i=1; i<=(n/2); i++)
pushdown (i, n);
for (i = n; i > 1; i--) {
swap (A[1], A); // видалення мінімального елементу
pushdown(1,i-1);}} //відновлення часткової впорядкованості
“Кишенькове” сортування
кишенькового сортування, коли створюються кишені для збереження записів з певними значеннями ключів. Ми перевіряємо, чи має даний запис ключ із значення k і якщо має, то поміщаємо цей запис в кишеню для записів, чиї значення ключів рівні k.
Але в загальному випадку ми повинні бути готовими до того, що в одній кишені може зберігатися декілька записів, а також повинні вміти об’єднувати вміст декількох кишень в одну, розташовуючи елементи в об’єднаній кишені в правильному порядку.
Для цього організуємо кишені у вигляді списків. Найкраще для цього підійдуть зв’язані списки, оскільки загальна кількість елементів, що будуть міститися в даній кишені на наперед не відома. Також нам потрібно масив В типу listtype, який буде містити вказівники на кишені.
Для об’єднання кишень використовуватиме функцію CONCATENATE(L1, L2), яка з двох списків L1: a1,a2,…,ai L2: b1,b2,…,bj формує результуючий список a1,a2,…,ai,b1,b2,…,bj.
void binsort () {
int I;
keytype v;
for (int i=0; i<n; i++)
// записує елемент A[i] на початок кишені,
// яка відповідає ключу цього елементу
INSERT (A, FIRST(B[A.key]), B[A.key]);
for (v = lowkey+; v <= highkey; v++)
// конкатенація всі кищень
CONCATENATE (B[lowkey], B[v]);}
Сортування злиттям.
В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву.
Постановка задачі пошуку. Методи пошуку.
Під оптимальністю пошуку будемо розуміти середній час, що необхідно витратити для знаходження елементу в масиві.Масив даних в якому здійснюється пошук може бути дійсним (порядок елементів не змінювався) і перетвореним (порядок елементів спеціальним чином впорядковано). Відповідно для першого випадку, для порівняння елементів можна застосовувати лише операцію ==, а в другому ще й операцію <.
Також можливе існування елементів із дубльованими ключами. В деяких програмах існування дубльованих ключів не припускається, тому ключі можна використовувати в якості курсорів на необхідні дані (номери кредитних карточок), але в деяких програмах може допускатися наявність декількох елементів з однаковими ключами (пошук по ключовому слову в базі даних телефонів).Обробка елементів з ключами що дублюються можна виконувати одним із декількох способів. Один із способів – це залишення в масиві даних лише одного елементу з дублюючими ключами, і щоб він посилався на масив, а якому містилися всі решта елементів з таким же ключем. В даному випадку, ми знаходимо всі елюенти одразу. Другий спосіб – це розташування дублюючих елементів в одному масиві і повернення в результаті пошуку першого із них. Такий підхід можливий для програм, що обробляють елементи по одному і порядок слідування елементі із однаковими ключами неважливий.Пошук з використанням індексації по ключах,,Послідовний пошук,,Бінарний пошук