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

Лабораторна робота № 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 умови. Можна об'єднати з в одне, поставивши в початок масиву спеціальний сторожовий елемент. Він повинен бути свідомо менше всіх інших елементів масиву.