
Лабораторна робота № 4.1
ОПИС МАСИВІВ НА МОВІ C++. АЛГОРИТМИ І ПРОГРАМИ ОБРОБКИ ОДНОМІРНИХ МАСИВІВ. АЛГОРИТМИ СОРТУВАННЯ.
МЕТА РОБОТИ. Задавши із клавіатури послідовність символів, реалізувати обробку її, як зазначено у варіанті. Вихідні дані задати самостійно, з огляду на специфіку конкретного варіанта.
У програмі повинні бути передбачені процедури вводу-висновку послідовності символів і її обробки. Вихідні дані повинні вводитися з перевіркою на область припустимих значень.
У протоколі лабораторної роботи повинна бути наведена блок-схема алгоритму.
ТЕХНІЧНЕ І ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ:
ПЕОМ з операційною системою Windows та компілятором Borland С++.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ.
1. Сортування вибором.
Ідея методу полягає в тому, щоб створювати відсортовану послідовність шляхом приєднання до неї одного елемента одним в правильному порядку. Якщо вхідна послідовність майже впорядкована, то порівнянь буде стільки ж, значить алгоритм поводиться неприродно.
void selectSort(int* arr, int size)
{
int tmp, i, j, pos;
for(i = 0; i < size; ++i) // i - номер текущего шага
{
pos = i;
tmp = arr[i];
for(j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
{
if (arr[j] < tmp)
{
pos = j;
tmp = arr[j];
}
}
arr[pos] = arr[i];
arr[i] = tmp; // меняем местами наименьший с a[i]
}
}
2. Сортування бульбашкою (обміном).
Ідея методу: крок сортування складається в проході знизу вгору по масиву. По дорозі проглядаються пари сусідніх елементів. Якщо елементи деякої пари знаходяться в неправильному порядку, то міняємо їх місцями.
void bubbleSort(int* arr, int size)
{
int tmp, i, j;
for(i = 0; i < size - 1; ++i) // i - номер прохода
{
for(j = 0; j < size - 1; ++j) // внутренний цикл прохода
{
if (arr[j + 1] < arr[j])
{
tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
}
Додаткова пам'ять, очевидно, не потрібно. Поведінка вдосконаленого (але не початкового) методу досить природне, майже відсортований масив буде відсортований набагато швидше випадкового. Сортування бульбашкою стійка, однак шейкер-сортування втрачає цю якість.
На практиці метод бульбашки, навіть з поліпшеннями, працює надто повільно. А тому - майже не застосовується.
3. Сортування вставками.
Сортування простими вставками в чомусь схожа на вищевикладені методи.
void insertSort(int* a, int size)
{
int i, j, tmp;
for (i = 1; i < size; ++i) // цикл проходов, i - номер прохода
{
tmp = a[i];
for (j = i - 1; j >= 0 && a[j] > tmp; --j) // поиск места элемента в готовой последовательности
a[j + 1] = a[j]; // сдвигаем элемент направо, пока не дошли
a[j + 1] = tmp; // место найдено, вставить элемент
}
}
Аналогічно сортуванню вибором, середнє, а також найгірше число порівнянь і пересилань оцінюються як O (n ^ 2), додаткова пам'ять при цьому не використовується.
Хорошим показником сортування є вельми природна поведінка: майже відсортований масив буде досортірован дуже швидко. Це, вкупі з стійкістю алгоритму, робить метод хорошим вибором у відповідних ситуаціях.
Алгоритм можна злегка поліпшити. Зауважимо, що на кожному кроці внутрішнього циклу перевіряються 2 умови. Можна об'єднати з в одне, поставивши в початок масиву спеціальний сторожовий елемент. Він повинен бути свідомо менше всіх інших елементів масиву.