Struktura_danikh_Ch1
.pdfЗадача. Дано масив А [N], де N - максимально можливе число елементів цього масиву. Фактичне число його елементів М може бути меншим за N. Після введення елементів масиву А потрібно зсунути їх на один елемент в кінець масиву, зберігаючи значення останнього введеного в масив елементу, звільняючи позицію першого елементу масиву.
Приклад розв’язання цієї задачі наведено на рис. 2.1. Нехай N=6, М=4, а масив А має вигляд
А=(1, 2, 3, 4, 0, 0).
Якщо М < N, то зсув може бути виконаний з дотриманням вимоги збереження останнього елементу - 4. Після означеного зсуву масив А буде мати вигляд
А=(1, 1, 2, 3, 4, 0).
Якщо це дуже важливо, то може бути виконана ще одна операція а1=0, після виконання якої А набуде вигляду
А=(0, 1, 2, 3, 4, 0).
Блок-схема алгоритму цієї операції подано на рис. 2.2.
Розроблені алгоритми можуть бути використані як частини інших, більш складних, алгоритмів.
2.2.3 Вставлення нового елемента в масив на заздалегідь відоме місце
Дано масив А [N]. В цьому масиві заповнено М позицій, тобто, поточний стан масиву складає М елементів, він може бути доповнений до N елементів. Потрібно на місце з номером К вставити новий елемент, значення якого задається змінною В.
Усі елементи первісного масиву А повинні зберегтися. У процесі розробки алгоритму необхідно передбачити наступні функції:
1Введення вхідних даних.
2Перевірку можливості виконання вставки нового елементу в масив.
3Звільнення місця під новий елемент.
4Вставлення елементу на "своє" місце.
13
Рисунок 2.2 - Блок-схема алгоритму зсуву елементів в кінець масиву
Алгоритм цієї операції наведений на рис 2.3.
14
Рисунок 2.3 - Блок-схема алгоритму вставлення нового елементу в масив на заздалегідь відоме місце
2.2.4 Додавання нового елемента в упорядкований масив
Дано масив А [N], елементи якого упорядковані за зростанням їх значень. Поточна кількість елементів в масиві дорівнює М. Потрібно, не порушуючи упорядкованості елементів масиву, додати в масив новий елемент, значення якого задається змінною В. Всі елементи первісного масиву повинні зберегтися.
Ця задача відрізняється від попередньої тим, що в попередньому випадку місце розташування нового елементу було відомо заздалегідь (як значення даного К). В даному прикладі необхідно визначити місце нового елементу. Фактично потрібно визначити такі два елементи з масиву А, для яких виконується одна з умов:
Аi-1 <= B < аi або Аi-1 < B<= аi, i=2, N.
Залежно від того, яка з цих умов буде використана у алгоритмі, елемент В повинний буде, в випадку В=аi, зайняти місце або спереду аi, або за ним. Алгоритм розв’язання задачі наведено на рис. 2.4.
15
2.2.5 Введення масиву з упорядкуванням його елементів
Якщо на вхід алгоритму надходять дані, що є елементами масиву А[N], то необхідно так організувати введення елементів масиву, щоб після закінчення введення елементи в масиві розташувались в порядку зростання.
Приклад.
На вхід надходять дані 8, 2, 3, 1.9, 7.
Після введення першого елементу 8 масив А приймає вигляд А=(8,...).
Після введення другого елементу 2 масив А буде мати вигляд А=(2, 8,...) і т. д.:
Для 3 - А ((2, 3, 8,...). Для 1 - A (1, 2, 3, 8,...). Для 9 - А ((1, 2, 3, 8, 9,...).
Для 7 - А ((1, 2, 3, 7, 8, 9,...).
Ця задача дуже схожа на попередню, вірніше, на багаторазове застосування алгоритму, наведеного на рис. 2.4, до масивів різноманітної довжини (що збільшуються кожний раз на один елемент).
Через М позначена кількість введених елементів масиву А; через В – змінна, в яку вводиться черговий елемент з вхідного потоку (черговий елемент масиву); через k – змінна, в якій зберігається значення індексу елементу масиву А (визначається під час ходу роботи алгоритму), якому повинно бути присвоєне знов введене значення В.
16
Рисунок 2.4 - Блок-схема алгоритму вставки елемента в упорядкований масив
Можливий алгоритм рішення наведений на рис. 2.5.
17
Рисунок 2.5. Блок-схема алгоритму вводу масиву з упорядкуванням його елементів
У цьому алгоритмі необхідно звернути увагу на блок 60. Коли в масив А ще не занесено жодного елементу (але значення змінної В вже введено), то в масиві А ще нічого зсувати. Блок 60 саме і забезпечує розв’язання ситуації при М=0. Якщо приріст (h) параметра циклу негативний (h=-1), то внутрішній цикл в цьому випадку не виконається жодного разу (при h<0 початкове значення параметра циклу повинно бути більше кінцевого), тобто зсув масиву виконуватися не буде. При М=0 параметр циклу i одержує перше значення
18
(i=0), а далі в умові циклу використовується аі, тобто a0. Але такого елементу в масиві немає, отже, таке посилання на елемент масиву А є некоректним.
2.3 Сортування даних
У алгоритмах раніше розглянутого ряду алгоритмічних операцій і прикладів рішень істотно використовувався той факт, що дані деяким чином упорядковані. Це підвищує ефективність роботи алгоритмів і спрощує самі алгоритми.
Дані упорядковуються за допомогою алгоритмів сортування даних. Це настільки важливі алгоритми, що практично кожна ЕОМ обладнана спеціальними програмами сортування даних, організованих у файлі.
Але це так звані програми зовнішнього сортування, тобто сортування даних розташованих на зовнішніх пристроях. З внутрішнім сортуванням (тобто, з сортуванням даних, розташованих в оперативній пам'яті) справи на багато складніші. В стандартному програмному забезпеченні ЕОМ програм внутрішнього сортування немає. І отже, їх необхідно складати власне розробникам програм.
2.3.1 Сортування даних методом обміну
Приклад. Дано масив А[N.] Необхідно розташувати його елементи в порядку збiльшення.
На початку роботи А=(3, 2, 5, 1, 4).
Необхідно послідовно порівнювати паpи елементів, що стоять поряд. Якщо виявиться, що елементи не упорядковані, то вони міняються місцями.
Спочатку порівнюються а4=1 і а5=4. Менший елемент передує більшому, отже, вони упорядковані. Після цього порівняння масив залишиться без зміни.
А= (3, 2, 5, 1, 4).
Порівняємо а3=5 і а4=1. Тут порушена упорядкованість елементів. Поміняємо їх місцями. Отримаємо
А= (3, 2, 1, 5, 4).
Порівняємо а2=2 і а3=1. Знову міняємо ці елементи місцями:
А= (3, 1, 2, 5, 4).
Порівняємо а1=3 і а2=1. Після обміну отримаємо А= (1, 3, 2, 5, 4).
Розглянуто всі паpи елементів, що стоять поруч. Але масив ще не упорядкований. В результаті найменший елемент зайняв “своє” місце. Можна сказати, що найменший елемент “сплив” знизу вверх (в початок) масиву. Тому цей алгоритм називають інколи методом “бульбашки”.
Повторно виконуючи послідовне попаpне порівняння всіх елементів (за винятком першого), отримаємо послідовність станів вектора А:
19
А= (1, 3, 2, 5, 4). А= (1, 3, 2, 4, 5). А= (1, 3, 2, 4, 5). А= (1, 2, 3, 4, 5).
Ще раз переглянувши всі елементи масиву, можна констатувати упорядкованість елементів масиву. Перестановок елементів в останньому перегляді не було.
Функції, які повинен забезпечувати алгоритм:
1Введення даних.
2Перегляд елементів масиву з метою порівняння паp елементів.
3Порівняння та перестановку елементів.
4Цикл для повторень переглядів паp елементів доти, доки елементи масиву залишаються неупорядкованими.
5Виведення результатів.
Можливий алгоритм опеpації наведений на pис. 2.6.
У цьому алгоритмі призначення блоку 80 - забезпечити перестановку двох елементів, що стоять поряд. Тут вводиться проміжна змінна С. Наприклад: С=100, Е=С. Це означає, що в область пам'яті, заpезеpвовану для змінної С, буде поміщене значення 100, а в поле пам'яті змінної Е вставляється значення змінної С.
Приклад: нехай В=10, D=20. Це можна відобразити наступним чином:
В 10 D 20.
Необхідно поміняти місцями значення В та D, тобто, повинно бути В 20 D 10.
Якщо тепер присвоїти змiннiй D значення змінної В, тобто, виконати оператор D=В, то отримаємо
В 10 D 10.
Це означає, що “старе” значення змінної D губиться. Отже, виконання оператора В=D не розв’язує задачі.
Для того, щоб уникнути втрати значення змінної D, перед наданням змiннiй D нового значення її попереднє значення необхідно зберегти, наприклад, надавши це значення проміжній змiннiй С, С=D:
В10 D 20 С 20.
Після цього можна виконати D=В
В10 D 10 С 20.
Останній крок: В=С
В20 D 10 С 20.
Тепер задача розв’язана.
20
Рисунок 2.6 - Блок–схема алгоритму сортування методом обміну
21
Елементи масиву з меншим значеннями за один перебір даних “спливають” в напрямку початку масиву. При цьому для того, щоб найменший елемент серед неупорядкованих елементів “сплив” на своє місце, достатньо одного перебору елементів масиву.
2.3.2 Сортування даних методом вибору
Приклад. Даний масив А[N]. Необхідно розташувати його елементи в порядку збiльшення.
Спочатку А= (3, 9, 5, 1, 8).
Ідея алгоритму полягає в фіксації номера елементу, а після цього вибоpу з елементів масиву того з них, який повинен стояти на місці обраного елементу. Номера елементів послідовно фіксуються від 1 до
(N-1)-го.
Який елемент масиву повинен стояти на першому місці? Цим елементом повинен бути той, який є найменшим серед всіх елементів масиву. Це - “1”, його номер в масиві 4-й. Необхідно змінити місцями 1 і 4-й елементи масиву. Перетворений вектор має вигляд
А= (1. 9, 5, 3, 8).
На місці 1-го елементу стоїть той, який повинен стояти на першому місці в несортованому масиві.
Далі необхідно підбирати елемент для другої позиції несортованого вектора. Їм повинен бути елемент зі значенням 3, що стоїть на 4-му місці. Перший елемент у виборі нового елементу участі не бере, бо він вже стоїть на своєму місці.
Після обміну місцями елементів з номерами 2 і 4 масив набуває вигляду А= (1.3, 5.9, 8).
Для визначення 3-го елемента виконуються ті ж дії, результатом є масив А= (1, 3, 5, 9, 8).
Аналогічно знаходиться 4-тий елемент А= (1, 3, 5, 8, 9).
На 4-му кроці одночасно встали на “свої” місця передостанній і останній елементи.
Алгоритм цього методу наведений на pис. 2.7.
22
