Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Strukturi_danikh_ta_algoritmi_-_konspekt_lektsi...doc
Скачиваний:
33
Добавлен:
23.11.2019
Размер:
870.4 Кб
Скачать

2.2.Сортування вибіркою

2.2.1.Сортування простою вибіркою

Даний метод реалізує практично „дослівно” сформульовану вище стратегію вибірки. При програмній реалізації алгоритму виникає проблема значення ключа „порожньо”. Досить часто програмісти використовують в якості такого деяке явно відсутнє у вхідній послідовності значення ключа, наприклад, максимальне з теоретично можливих значень. Інший підхід – створення окремого вектора, кожний елемент якого має логічний тип і відображає стан відповідного елемента вхідної множини (true – „не порожньо”, false – „порожньо”). Алгоритм дещо ускладнюється за рахунок того, що для установки початкового значення при пошуку мінімуму доводиться відкидати вже „порожні” елементи.

Алгоритм проілюструємо функцією сортування цілих чисел.

void Sort(int *a, int *b)

{

int i, j, m;

bool c[N]; // стан елементів вхідної множини

for (i=0; i<N; i++)

c[i] = true; // скидання відміток

for (i=0; i<N; i++) // пошук 1-го невибраного ел. у вх. множині

{

j = 0;

while ( !(c[j]) )

j++;

m = j; // пошук мінімального елемент а

for ( j=1; j<N; j++ )

if ( c[j] && ( a[j] < a[m] ) )

m = j;

b[i] = a[m]; // запис у вихід. множину

c[m] = false; // у вхідну множину - "порожньо"

}

}

2.2.2.Обмінне сортування простою вибіркою

Алгоритм сортування простою вибіркою рідко застосовується в попередньому варіанті. Набагато частіше застосовується його обмінний варіант. При обмінному сортуванні вибіркою вхідна і вихід множини розташовуються в одній і тій же ділянці пам’яті; вихідна – на початку ділянки, вхідна – в тій частині, що залишилася. У початковому стані вхідна множина займає всю ділянку, а вихідна множина – порожня. У міру виконання сортування вхідна множина звужується, а вихідна – розширяється.

Принцип методу полягає в наступному. Знаходять і вибирають в масиві елементів елемент з мінімальним значенням на інтервалі від 0 (першого) до N-1 (останнього) елемента і міняють його місцями з першим (0) елементом. На другому кроці знаходять елемент з мінімальним значенням на інтервалі від другого (1) до останнього (N-1) елемента і міняють місцями його з другим (1) елементом. І так далі для всіх елементів до N-1.

Обмінне сортування простою вибіркою показане в наступному прикладі. Процедура має тільки один параметр – сортований масив.

void Sort(int *a)

{

int i, j, m;

for (i=0; i<N-1; i++) // перебір елементів вихідної множини

// вхідна множина - [і:N-1]; вихідна - [0:і-1]

{

m = i;

for (j=i+1; j<N; j++) // пошук мінімуму у вхідній множині

if ( a[j] < a[m] )

m = j;

// обмін 1-го елемента вх. множини з мінімальним

if ( !(i == m) )

Swap(a[i], a[m]);

}

}

Очевидно, що обмінний варіант забезпечує економію пам’яті та при його реалізації не виникає проблема „порожнього” значення. Загальна кількість порівнянь зменшується удвічі – N*(N-1)/2, але порядок алгоритму залишається степеневим – . Кількість перестановок N-1, але перестановка, мабуть, удвічі більше потребує часу, ніж пересилка в попередньому алгоритмі.

Досить проста модифікація алгоритму обмінного сортування вибіркою передбачає пошук в одному циклі перегляду вхідної множини відразу і мінімуму, і максимуму, і обмін їх з першим і з останнім елементами множини відповідно. Хоча сумарна кількість порівнянь і пересилок в цій модифікації не зменшується, досягається економія на кількості ітерацій зовнішнього циклу.

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

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