Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
221_Avtosokhranenny.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
181.96 Кб
Скачать

Функція знаходження опорного елементу та функція перестановки елементів для методу швидкого сортування

Важливим елементом даного сортування є знаходження значення опорного ключа, відносно якого буде проведено перерозподіл елементів масиву.

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]);}

Сортування злиттям.

В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву.

Постановка задачі пошуку. Методи пошуку.

Під оптимальністю пошуку будемо розуміти середній час, що необхідно витратити для знаходження елементу в масиві.Масив даних в якому здійснюється пошук може бути дійсним (порядок елементів не змінювався) і перетвореним (порядок елементів спеціальним чином впорядковано). Відповідно для першого випадку, для порівняння елементів можна застосовувати лише операцію ==, а в другому ще й операцію <.

Також можливе існування елементів із дубльованими ключами. В деяких програмах існування дубльованих ключів не припускається, тому ключі можна використовувати в якості курсорів на необхідні дані (номери кредитних карточок), але в деяких програмах може допускатися наявність декількох елементів з однаковими ключами (пошук по ключовому слову в базі даних телефонів).Обробка елементів з ключами що дублюються можна виконувати одним із декількох способів. Один із способів – це залишення в масиві даних лише одного елементу з дублюючими ключами, і щоб він посилався на масив, а якому містилися всі решта елементів з таким же ключем. В даному випадку, ми знаходимо всі елюенти одразу. Другий спосіб – це розташування дублюючих елементів в одному масиві і повернення в результаті пошуку першого із них. Такий підхід можливий для програм, що обробляють елементи по одному і порядок слідування елементі із однаковими ключами неважливий.Пошук з використанням індексації по ключах,,Послідовний пошук,,Бінарний пошук

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]