Аналіз методів сортування одновимірного масиву

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ХЕРСОНСЬКИЙ ДЕРЖАВНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
Кафедра ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
розробку програм для
Аналізу методів сортування одновимірних масивів.

Курсовий проект

з дисципліни «Програмування»
Пояснювальна записка
Виконавець
студент групи 2КСС3 ________________________
(Підпис, дата)
Керівник
старший викладач ________________________
(Підпис, дата)

Нормоконтролер
старший преподаватель_________________________
(Підпис, дата)

РЕФЕРАТ
Курсовий проект містить: стор - 39 машинописного тексту, літературних джерел - 5, додатки - 2.
Ключові слова: ФУНКЦІЯ, ФАЙЛ, МЕТОД, МАСИВ.
У курсовому проекті розглянута модифікація і порівняння двох текстових файлів. Програма написана на мові програмування Сі та працездатна на IBM сумісних комп'ютерах. Програма має псевдографічний і графічний інтерфейси, володіє достатнім швидкодією і невеликим розміром.

ЗМІСТ

Введення ................................................. .................................................. . 3

1. Постановка завдання ................................................ ................................ 5
1.1. Аналіз існуючих рішень поставленої задачі ................ 5
1.2. Обгрунтування вибору методу розв'язання задачі ............................... 16
2. Розробка алгоритму рішення задачі .............................................. . 17
3. Розробка програми ................................................ ........................ 18
3.1 Опис програми і використовуваних в ній функцій ................... 18
3.1.1 Опис функції main ().......................................... ..................... 21
3.1.2 Опис функції srecmg ().......................................... .................. 21
3.1.3 Опис функцій qqsort ().......................................... ................... 22
3.1.4 Опис функції grafix ().......................................... .................... 23
3.2 Керівництво програміста ............................................... ............... 25
3.3 Керівництво оператора ............................................... ..................... 26
Висновок ................................................. ................................................ 28
Список використаної літератури ............................................... ......... 29
Додаток 1 ................................................ ........................................... 30
Додаток 2 ................................................ ........................................... 39

ВСТУП
Сі - це мова програмування загального призначення, добре відомий своєю ефективністю, економічністю. Зазначені переваги Сі забезпечують хорошу якість розробки майже будь-якого виду програмного продукту. Використання Сі в якості інструментальної мови дозволяє одержувати досить швидкі і компактні програми. У багатьох випадках програми, написані на Сі, порівнянні за швидкістю з програмами, написаними на мові асемблера [2]. При цьому вони мають кращу наочність.
Сі поєднує ефективність і потужність у відносно малому за розміром мовою. Хоча Сі не містить вбудованих компонент мови, що виконують введення-виведення, розподіл пам'яті, маніпуляцій з екраном або управління процесами, тим не менш, системне оточення Сі має у своєму розпорядженні бібліотекою об'єктних модулів [3], в якій реалізовані подібні функції. Бібліотека [4] підтримує багато хто з функцій, які потрібні. [1]
Мова Сі - це універсальна мова програмування, для якого характерні економічність висловлювання, сучасний потік управління і структури даних, багатий набір операторів. Мова Сі не є ні мовою "дуже високого рівня", ні "великим" мовою, і не призначається для деякої спеціальної області застосування, але відсутність обмежень і спільність мови роблять його більш зручним і ефективним для багатьох завдань, ніж мови, ймовірно більш потужні.
Він тісно пов'язаний з операційною системою "UNIX" [4], так як був розвинений на цій системі і так як "UNIX" та її програмне забезпечення написано на "C". Сама мова, проте, не пов'язаний з якоюсь однією операційною системою або машиною, і хоча його називають мовою системного програмування, так як він зручний для написання операційних систем, він з рівним успіхом використовувався при написанні великих обчислювальних програм, програм для обробки текстів і баз даних [2].

2. ПОСТАНОВКА ЗАВДАННЯ
2.1 АНАЛІЗ ІСНУЮЧИХ Вирішення поставлених завдань
В даний час існує безліч алгоритмів cортіровкі [5] масивів, які застосовуються залежно від того які умови функціонування стоять перед разрабатимаемой програмою.
1. Методи вставки. Алгоритм простих вставок.
1.1. Бінарні вставки
1.2. Двоколійних вставки
1.3. Вставки одночасно кількох елементів.
1.4. Вставки з убуваючим кроком (метод Шелла)
1.5. Вставки в зв'язаний список
1.6. Вставки у кілька пов'язаних списків
2. Обмінна сортування
2.1. Метод бульбашки
2.2. Модифікація методу бульбашки
2.3. Швидке сортування.
2.4. Обмінна поразрядное сортування
2.5. Паралельна сортування Бетчера
3. Сортування за допомогою вибору
(Використання пов'язаного списку для зберігання
інформації про проміжні максимумах.)
4. Сортування за допомогою злиття
Методи вставки. Алгоритм простих вставок.
Нижче описаний основний алгоритм простих вставок, який породжує кілька модифікацій, які використовуються в завданнях. Алгоритм використовує прийом, яким користуються гравці в карти при сортуванні щойно розданої колоди: чергова карта вставляється між вже впорядкованими раніше.
Опис алгоритму простих вставок. Файл, що підлягає сортуванню, в загальному випадку складається з елементів-записів, що включають інформаційну частину і ключі, за якими проводиться упорядкування за зростанням. Оскільки інформаційна частина майже не впливає на процес соріровкі, будемо припускати, що файли, використовувані в прикладах, состот тільки з елементів-ключів, а інформаційна частина запису від сутствуєт.
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Бінарні вставки
Для прискорення числа порівнянь при пошуку місця, в яке потрібно вставити елемент X, можна використовувати логарифмічний [5] пошук. Це означає, що спочатку Х порівнюється з елементом k [j / 2], потім, в залежності від результату порівняння, з елементом, що лежить посередині між 1 і j / 2 або посередині між j / 2 +1 і j і т.д. . При цьому чіслосравненій для кожного j дорівнює приблизно log (j). Число пересилань еле ментів при цьому не змінюється і залишається приблизно рівним NЅ / 4.
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * NЅ + b * N + c * N * logN
де a, b, c - невідомі константи, що залежать від програмної реалізації алгоритму.
Двоколійних вставки
Число пересилань можна скоротити приблизно в 2 рази до NЅ / 8, якщо допустити зрушення елементів не тільки вправо, але і вліво. Для вихідного файлу резервується місце в пам'яті, рівне 2N +1, де N - кількість елементів у вихідному файлі. Перший елемент пересилається в середину вихідного файлу. Надалі елементи вихідного файлу зсуваються вправо або вліво в залежності від того, в яку сторону потрібно зрушувати менше елементів. Приєднання нових елементів до вихідного файлу відбувається як справа, так і зліва від центрального елемента з можливим зсувом вправо або вліво.
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Вставки одночасно кількох елементів.
Модифікація методу простих вставок полягає в тому, що замість однієї змінної Х можна використовувати декілька змінних Х1, Х2, ... Xm, які мають значення елементів, що підлягають вставці у вже впорядковану частину файлу. Х1, X2, ... Xm впорядковані за зростанням, тому порівнюючи Xm в циклі по змінної i з елементами впорядкованої частини, ми можемо гарантувати, що, якщо черговий елемент k [i] більше Xm, то він більше й інших елементів. Перенесення елементів вихідного файлу вперед у циклі по i виконується на m елементів, тобто замість k [i +1] = k [i] у вихідному алгоритмі в модифікованому алгоритмі записується k [i + m] = k [i]. При знаходженні k [i] такого, що він менше Хm, Хm ставиться на місце k [i + m] і m зменшується на 1. Далі цикл по i продовжується з новим m. Економія числа переносів елементів досягається за рахунок переносів відразу на m елементів.
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * NЅ + b * N + c * N * logN
де a, b, c - невідомі константи, що залежать від програмної реалізації алгоритму.
Вставки з убуваючим кроком (метод Шелла)
Ідея алгоритму полягає в обміні елементів, розташованих не тільки поруч, як у алгоритмі простих вставок (п.1), але і далеко один від одного, що значно скорочує загальне число операцій переміщення елементів. Для прикладу візьмемо файл з 16 елементів. Спочатку проглядаються пари з кроком 8. Це пари елементів 1-9, 2-10, 3-11, 4-12, 5-13, 6-14, 7-15, 8-16. Якщо значення елементів в парі не впорядковані за зростанням, то елементи міняються місцями. Назвемо цей етап 8-сортуванням. Наступний етап - 4-сортування, на якому елементи у файлі діляться на четвірки: 1-5-9-13, 2-6-10-14, 3-7-11-15,4-8-12-16. Виконується сортування в кожній четвірці. Сортування може виконуватися методом простих вставок (п.1). Наступний етап - 2-сортування, коли елементи у файлі діляться на 2 групи по 8:
1-3-5-7-9-11-13-15 і 2-4-6-8-10-12-14-16. Виконується сортування в кожній вісімці. Нарешті весь файл упорядковується методом простих вставок. Оскільки дальні елементи вже перемістилися на своє місце або знаходяться поблизу від нього, цей етап буде значно менш трудомістким, ніж при сор-вання вставками без попередніх "далеких" обмінів.
Файл після остаточної сортування (1-сортування): 61 87 154 170 275 426 503 509 512 612 653 677 703 765 897 908
Час роботи алгоритму t приблизно оцінюється формулою: t = a * N ** b
де a і b - невідомі константи, що залежать від програмної реалі-
ції алгоритму.

Вставки в зв'язаний список
Серед загальних способів поліпшення алгоритму простих вставок можна розглянути спосіб, заснований на зміні структури даних. Сортування простими вставками складається з двох основних операцій:
- Перегляду вихідного файлу з порівнянням змінної Х з
елементами K [i] файлу;
- Вставки нового елемента шляхом зсуву елементів, що залишилися
вправо.
Файл досі розглядався як лінійний список і для виконання операції вставки в ньому необхідно перемістити в середньому половину еле-ментів. Відомо, що для операцій вставки ідеально подходітсвязанний список, так як в цьому випадку вставка вимагає всього лише зміни декількох зв'язків. Операція послідовного перегляду для пов'язаного списку майже так само проста, як і для лінійного списку. Оскільки файл завжди проглядається в одному напрямку, то досить мати список тільки з одного зв'язком. З іншого боку пов'язане розподіл робить неможливим бінарний пошук, тому купуючи перевагу у виконанні операції вставки, ми втрачаємо в порівнянні з бінарним пошуком в ефективності операції перегляду і порівняння. Розглянемо алгоритм простих вставок на зв'язаному вперед списку.
Дан файл у вигляді связанниого списку, кожен елемент якого містить крім ключа K [i] ще і покажчик на наступний елемент L [i].
Крім того є ще додаткова змінна L [0], що містить покажчик на останній N-й елемент файлу. Покажчик L [N] дорівнює нулю, що є ознакою кінця списку елементів.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Вставки у кілька пов'язаних списків
Ідея методу грунтується на припущенні, що ключі у вихідному файлі мають значення в деякому відомому діапазоні MAX і в цьому діапазоні вони розподілені досить рівномірно. Тоді за аналогією з методом вставки в один зв'язаний список можна організувати декілька, наприклад, Q списків. Величина Q залежить від очікуваного середнього колічес-тва елементів M в кожному списку тобто Q = N / M, N - кількість ключів.
При розробці програми потрібно проаналізувати залежність часу роботи методу від параметра М для різних вихідних файлів і дати рекомендації з вибору оптимального значення.
Схема алгоритму має наступний вигляд. Через Q позначена кількість списків, масив B [1] ... B [Q] служить для зберігання покажчиків на початку окремих списків. Перед початком роботи алгоритму елементи масиву У передбачаються рівними 0. Кожен i-й елемент вихідного файлу містить ключ K [i] і покажчик L [i] на наступний елемент списку. Значення L [i] = 0 відповідає останньому елементу в списку, покажчик B [1] вказує на початок першого підсписки і одночасно на початок всього списку. Через minK позначено мінімальне значення ключа у файлі, через М - середнє вибране значення кількості елементів у підсписку. d - номер поточного списку, в який повинен бути вставлений елемент K [j]. Величина R = MAX / Q є діапазон значень ключів, що припадає на один список.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Обмінна сортування
Назва цієї групи методів походить від основного типу операцій, використовуваного в алгоритмах - обмін двох елементів у файлі своїми значеннями. Ця операція використовується і в інших групах, тому класифікацію не можна визнати цілком суворої, але такий розподіл тим не менш є традиційним. Файл, що підлягає сортуванню, в загальному випадку складається з елементів-записів, що включають інформаційну частину і ключі, за якими проводиться упорядкування за зростанням.
Оскільки інформаційна частина майже не впливає на процес сортування, будемо припускати, що файли, використовувані в прикладах, состот тільки з елементів-ключів, а інформаційна частина запису відсутня.
Метод бульбашки
Алгоритм досить очевидний.
Пари стоять поруч елементів проглядаються в напрямку знизу вгору і порівнюються. Якщо верхній елемент виявляється менше нижнього, то вони міняються місцями. Продовжуючи цей процес циклічно, ми врешті-решт прийдемо до відсортованому файлу.Файл розташований вертикально знизу вгору, щоб ефект спливаючого бульбашки виглядав більш наочно. Елементи з великим значенням ключа "спливають" вгору, після послідовних сравнівненій з сусідніми елементами.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалі-
ції алгоритму.
Модифікація методу бульбашки
Модифікація методу бульбашки полягає в тому, що файл можна переглядати як з початку до кінця, так і з кінця до початку поперемінно. Це трохи скорочує число переміщень елементів.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Швидке сортування.
Основна стратегія прискорення алгоритмів сортування - обміни між якомога більш далекими елементами вихідного файлу - в методі швидкого сортування реалізована за рахунок того, що один із ключів у вихідному файлі використовується для поділу його на два подфайла так, щоб зліва від вибраного елемента знаходилися тільки елементи з меншими ключами, а праворуч - тільки з великими. Елемент, що розділяє файл, поміщається між його двома подфайламі і процедура виконується рекурсивно для кожної половини до тих пір, поки в черговому новому подфайле не виявиться менше, ніж М елементів, де М - заздалегідь вибране число.
Сортування подфайлов, що містять менше ніж М елементів, виконується будь-яким простим методом, наприклад простими вставками. Таким чином, реалізація методу залежить від двох параметрів: значення М і способу вибору елемента, який призначений для розділення файлу на дві частини.
Блок вибору Х в найпростішому випадку формулюється як X = K [l], однак це може призвести до вкрай неефективного алгоритму. Найбільш просте краще рішення - вибирати Х як випадковий ключ з діапазону K [l] ... K [r] і обміняти його з K [l].
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * N * logN + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Обмінна поразрядное сортування
Даний метод використовує двійкове подання ключів. Файл сортується послідовно по бітах двійкового представлення ключів, починаючи зі старшого. Ключі, що мають значення даного біта, равноенулю, ставляться в ліву половину файлу, а ключі із значенням біта 1 в праву. Функція b (ключ) повертає значення ьіта з номером b аргументу, m-якомога більше значущих бітів в ключах.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * N * logN + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Паралельна сортування Бетчера
Для отримання алгоритму обмінної сортування, час роботи якого менше, ніж NЅ, необхідно вибирати для порівняння та обміну ключі, розташовані можливо далі один від одного. Ця ідея вже була реалізована в алгоритмі сортування Шелла вставок з убуваючим кроком, проте в даному алгоритмі порівняння виконуються по-іншому.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * N * (logN) Ѕ
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Сортування за допомогою вибору
Ідея методу досить проста: знайти найбільший елемент файлу і по-ставити його на місце N, знайти наступний максимум і поставити його на місце N-1 і т.д. до 2-го елемента.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N * logN
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Використання пов'язаного списку для зберігання інформації про проміжної максимумах.
В алгоритмі максимум серед K [1] ... K [j-1] визначається в циклі від j-1 до 1 c метою забезпечити менше число обмінів у разі рівності ключів і збереженні колишнього порядку рівних елементів. Однак, якщо змінити порядок перегляду елементів на протилежний і змінити структуру даних, ввівши додаткові покажчики, можна приклад-но в два рази скоротити кількість повторень у циклі пошуку максісмума. Кожен ключ K [i] постачається покажчиком L [i] на елемент, максимальний серед перших i-1 елементів.
Тоді після обміну елементів K [j] і K [m] пошук максимуму в наступному циклі по j можна здійснювати серед елементів K [L [m]] ... K [j] при началь-них значеннях X = K [L [m]], m = L [m], тому що максимум може "оновитися" тільки за рахунок елементів, що лежать правіше локального максимуму. Таким чином середня кількість переглядаються при пошуку максимуму елементів зі-Припиняються приблизно в два рази.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * NЅ + b * N * logN
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Сортування за допомогою злиття
Алгоритми сортування цього класу грунтуються на об'єднанні кількох (найчастіше двох) вже упорядоченнх файлів. Розглянуті далі алгоритми вибирають з вихідного файлу впорядковані відрізки і об'єднують їх в більш довгі.
Природне двоколійних злиття
Цей алгоритм шукає впорядковані відрізки з двох кінців файлу іперепісивает їх по черзі також в обидва кінці. Повторюючи цю процедуру в циклі, ми приходимо до середини файлу, що означає закінчення сортування.
Елементи файлу пересилаються з однієї області в іншу, міняючи напрямок пересилки. Для запам'ятовування напрямку пересилання служить мінлива s, що приймає значення TRUE і FALSE поперемінно. Інший логічний ознака f служить сигналом продовження-закінчення алгоритму, якщо всі області злилися в кінці кінців в одну. Змінна d приймає поперемінно значення +1 -1 і вказує напрям перегляду файлу: вперед чи назад.Операція <-> позначає обмін значеннями двох змінних. Операція Џ позначає інверсію логічної змінної або виразу.
Час роботи алгоритму t приблизно оцінюється формулою:
t = a * N * lgN + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
Просте двоколійних злиття.
В алгоритмі природного двоколійних злиття упорядкований відрізки файлу визначалися випадковим розташуванням елементів у вихідному файлі. У даному алгоритмі довжина відрізків фіксується на кожному кроці. У вихідній файлі всі відрізки мають довжину 1, після першого кроку вона дорівнює 2, після другого 4, після третього - 8, після к-го кроку -2 в ступеня к.
Час роботи алгоритму t приблизно оцінюється формулою: t = a * N * lgN + b * N
де a, b - невідомі константи, що залежать від програмної реалізації алгоритму.
1.2 ОБГРУНТУВАННЯ ВИБОРУ МЕТОДУ РОЗВ'ЯЗАННЯ ЗАДАЧІ
Сортування масиву швидким методом є прекрасним прикладом целесооразності використання рекурсивного звернення до програмувати мовою Сі. Метод швидкого сортування був запропонований К. А. Р. Хоор у 1962р. Запропонована версія швидкого сортування, зрозуміло, не найшвидша серед всіх можливих, але зате вона з найпростіших.
Основна стратегія прискорення алгоритмів сортування - обміни між якомога більш далекими елементами вихідного файлу - в методі швидкого сортування реалізована за рахунок того, що один із ключів у вихідному файлі використовується для поділу його на два подфайла так, щоб зліва від вибраного елемента знаходилися тільки елементи з меншими ключами, а праворуч - тільки з великими.
Алгоритми сортування методом злиття грунтуються на об'єднанні кількох (найчастіше двох) вже упорядоченнх файлів. Цей алгоритм шукає впорядковані відрізки з двох кінців файлу і переписує їх по черзі також в обидва кінці. Повторюючи цю процедуру в циклі, ми приходимо до середини файлу, що означає закінчення сортування.

3. РОЗРОБКА АЛГОРИТМУ РІШЕННЯ ЗАДАЧІ
Алгоритм рішення завдання гранично простий. Функція main ()-це також функцією меню і виконує опитування клавіатури. Залежно від натиснутої клавіші виконує відповідні дії програми. Для читання інформації про програму з файлу text.hlp використовується функція help (), яка працює з файловим висновком. Функція file () основна оскільки з її допомогою виконується сортування масиву (виклик функцій qqsort () і srecmg ()) визначення часу сортування виклик функції побудова гістограм. Масив складається з випадкових чисел вводяться в нього функцією генератора випадкових чисел. Далі функція file () викликає відповідні функції сортування, засікає час сортування відповідним способом, і заносить цей час в масив simvol []. Далі дані з масиву передаються у функцію grafix (), де вони використовуються при виведенні на екран гістограм в графічному режимі. Програма передбачає випадки відсутності деяких програмних елементів. У цьому випадку викликається функція Error (), яка створює вікно повідомлення в яке вписуються характеристика помилки. Так програма не буде виконуватися якщо не знайдений файл "text.hlp" або драйвер EGAVGA.BGI
.
3. РОЗРОБКА ПРОГРАМИ
3.1 ОПИС ПРОГРАМИ
Дана програма називається "TEST" (ім'я виконуваного файлу test.exe) і призначена для аналізу методів сортування одновимірного масиву. Програма працює на IBM сумісних комп'ютерах сімейства х86 починаючи з 286 і вище, в операційній системі типу Ms-DOS 3.0 і вище.
Програма містить п'ять основних функцій: main (), file (), qsort (), srecmg (), grafix (). Всі змінні, що використовуються в програмі є локальними.
Функція main () містить пункти меню і викликає інші виконавчі функції залежно від натискання запропонованих функціональних клавіш F1, F2 і F10. Кожна з цих функцій працює автономно і незалежно від двох інших.
Програма реалізована як у псевдографічним так і в графічному режимі (у зв'язку з чим вона може компілюватися тільки в DOSовскіх версіях BorlandC + + або BorlandC). У графічному режимі вона виводить на екран гістограму яка характеризує час сортування масивів двома способами.
Програма використовує як стандартний так і файловий ввід-висновок інформації. Стандартне введення представлений запитом програми на введення функціональних клавіш, які задають характер виконуваної дії. Файловий ввід-висновок використовується у функції help (), для виводу на екран інформації про розробника програми, її функціональні клавіші і про можливі помилки в процесі виконання. Крім того програма працює з функцією часу clock () і змінними часу типу clock_t.
Так само програма містить стандартні функції мови Сі, описані в бібліотеках: <string.h>, <stdlib.h>, <time.h>, <stdio.h>, <conio.h>, <graphics.h>. Нижче перераховані бібліотеки з функціями і дано короткий опис використаних у програмі стандартних функцій.
З бібліотеки <time.h>:
clock () - ця функція повертає час, що фіксується процесором від початку рахунку програми, або -1, есле воно не відомо. Для повернення цього часу в секундах застосовується формула clock () / CLK_TCK.
З бібліотеки <stdlib.h>:
rand () - ця функція видає псевдо випадкове число в діапазоні від 0 до RAND_MAX не менше 32767.
exit () - викликає нормальне завершення програми.
З бібліотеки <stdio.h>:
printf () - ця функція здійснює висновок рядка на екран.
fopen () - ця функція відкриває файл із заданим ім'ям і повертає потік або NULL, якщо спроба відкриття була невдалою.
fclose () - ця функція проводить дозапис ще незаписаних буферізірованний даних, скидає нечитаний буферізірованний введення, звільняє всі автоматичні запитані буфера, після чого закриває потік. Повертає EOF у разі помилки і 0 у противному випадку.
fgetc () - ця функція повертає следущуюлітеру з потоку stream у вигляді unsigned char або EOF, якщо вичерпано файл або виявлена ​​помилка.
puts () - пише стринг s та літеру нова - рядок в stdout. Повертає EOF у разі помилки, або позитивне значення, якщо запис пройшов нормально.
З бібліотеки <conio.h>
textbackground () - за допомогою цієї функції встановлюється колір фону для функції cprintf ().
textcolor () - за допомогою цієї функції встановлюється колір тексту для функції cprintf ().
clrscr () - функція очищення екрана, кольором встановленим функцією textbackground ().
cprintf () - за допомогою цієї функції здійснюється виведення рядка з урахуванням квітів встановлених функціями textbackground (), textcolor ().
_setcursortype () - за допомогою даної функції здійснюється зміна режиму відображення курсора. Даних режимів у си всього три - NOCURSOR (курсор вимкнений), SOLIDCURSOR (курсор у вигляді суцільного блоку) NORMALCURSOR (звичайний курсор).
getch () - функція getch здійснює зчитування першого єдиного символу з клавіатури, використовується при зчитуванні клавіш курсору при переміщенні по вікну вибору режиму роботи програми.
gotoxy () - ця функція переміщує курсор в потрібну частину екрану, зазвичай використовується перед функцією cprintf ().
У цій бібліотеці описані всі символічні константи квітів використовувані функціями textbackground (), textcolor (). У ній також описані всі типи курсорів використовуваних функцією _setcursortype ().
3.1.1 ОПИС ФУНКЦІЇ main ()
Функція main має тип void і є функцією меню. Main виконує опитування клавіатури і залежно від натиснутої функціональної клавіші виконується відповідна дія (виклик допомоги, тестування і вихід з програми). Ця можливість реалізована завдяки конструкції множинного вибору switch. Функція має одну локальну змінну divss має тип char. Вона сприймає символ з клавіатури без виведення на екран і використовується в конструкції switch при переході до іншої виконуваної функції. У даній функції викликається допоміжна функція windows (), яка створює псевдографічний інтерфейс при запуску програми. При виборі пункту виходу з програми стандартна функція textbackground () створює чорний екран, а функція exit () здійснює вихід з програми.
При виклику функції допомоги (help ()) програма звертається до цієї функції, яка зчитує і виводить інформацію файловим способом. Викликаний фаил зберігається під ім'ям test.hlp і при його відсутності видається вікно повідомлення: «Фаил text.hlp не знайдений".
Виклик функції побудови гістограм виконується при натисканні клавіші F2. При цьому функція main () звертається до функції file ().
3.1.2 ОПИС ФУНКЦІЇ srecmg ().
Для побудови упорядкованого списку В 'зі списку В = <к1, к2 ,..., Кn> при сортуванні злиттям список В ділиться на n підсписків В1 = <к1>, В2 = <к2>, ... , Вn = <Кn> довжини 1. Потім відбувається процедура проходження в якій m ≥ 2 упорядкованих списків В1, В2 ,..., Вm змінюються на m / 2 (або (m +1) / 2) упорядкованих списків які створюються злиттям B2i-1и B2i (2i ≤ m) і підсумовуванням Bm c непарним m. Процес повторюється до появи однієї послідовності довжини m. Кількість дій, необхідних для сортування злиттям, дорівнює n log2n, тому що за одне проходження виконується n порівнянь, а всього необхідно здійснити log2n проходжень. Сортування сліянііем дастаточно ефективно і використовується при великих значення n.
Функція srecmg () є рекурсивної, і сортує масив а [n]. За кожним викликом масив для сортування ділиться на дві частини - від а [0] до
a [i-1] і від a [i] до a [n], кожна з яких впорядковується окремо, а потім виконується їх злиття. Злиття виконується за допомогою викликається функції merge () в яку передається покажчик на масив, поточний номер елемента масиву і кількість елементів масиву. Параметрами функції merge () є масив w [], його довжина l / 2 і довжина першої частини масиву l1. Функція merge () виконує злиття подмассивов, утворюючи на їх місці впорядкований масив w [0], w [1 ],... , w [l2-2], w [l2-1].
3.1.3 ОПИС ФУНКЦІЇ qqsort ()
Швидке сортування полягає в тому, що список В = <k1,k2,…,kn> реорганізується в B ', <k1>, B ", де В' - подспісок В з елементами, не великими k1, а B" - підсписок У з елементами великими k1. У списку В ', <k1>, В "елемент К1 вже знаходиться на місці де він повинен бути в отсортірованом списку. Далі до списків В 'і В''застосовується упорядованіченіе швидкої сортуванням.
Рекурсивна функція qqsort упорядоваечет швидкої сортуванням ділянку масcіва цілих чисел перший елемент якого вказується показником v [left], останній - показником v [right].
Якщо ділянка масива більш ніж з двох елементів, v [left] - low> 1, то перебуває ділив елемент і переноситься в V [0]. Мінно last присвоюється значення першого елемента масиву left. Потім масив ділиться на дві частини, елементи яких відповідно більше і менше last. Далі функція виконує перезапам'ятовування ділить елемента і викликає себе для розбитих підсписків.
Обмін елементів виконується за допомогою функції swap (), в яку з функції qqsort () перелається покажчик на масив і елементи, місце-розташування яких у масиві потрібно звернути.
Час побудови списку залежить від його початкового стану. Час буде мінімальним, якщо кожен крок розділу дає підсписки В ', B''приблизно однакової довжини; тоді необхідно (n log2 n) кроків. Якщо початковий список мало чим відрізняється від звичайного відсортовані то необхідно (n ^ 2) / 2 кроків. Швидке сортування вимагає додаткової пам'яті порядку O (log2n) для виконання рекурсивної функції qqsort () (неявного стека).

3.1.4 ОПИС ФУНКЦІЇ grafix ()
Функція grafix () має тип void і параметр simbol [2] - масив швидкості виконання сортування. Ця функція викликається при побудові гістограми і працює в графічному режимі про що інформує рядок initgraph (& gdriver, & gmode, ""), яка встановлює систему в графічний режим, визначає характеристику відеодрайвера. Якщо змінна errorcode не отримує значення grOk, то подальше виконання програми не можливе, оскільки графічний режим не встановлений (про що виводиться повідомлення). У масиві simvol [] визначається більший елемент, стовпець якого встановлюється в 100%.
Рядок:
bar3d (midx + otst + siz * n, midy-CopySimvol [n], midx + siz * (n +1), midy, 15, 1); створює 3D-зображення гістограм, висота яких визначається масивом CopySimvol [n].
Колір виведених елементів зображення устонавливается функція setcolor (), а всі виведені лінії будуються функцією line (). Текст виводиться за допомогою функції outtextxy (). Якщо текст повинен виводитися вертикально то функції settextstyle () задається параметр VERT_DIR.
Після виведення на екран зображення виконується опитування клавіатури і якщо користувачем була натиснута клавіша "ESC", то програма повертається у функцію file () і далі в функцію main (), де знову очікує натискання необхідної клавіші.
Функція closegraph () закриває графічний режим.
3.2 КЕРІВНИЦТВО ПРОГРАМІСТА

Дана програма призначена для аналізу методів сортування масивів швидкої і злиттям. Програма може працювати на IBM сумісних комп'ютерах сімейства х86 починаючи з 286 і вище, під управлінням операційних систем Ms-DOS 3.0 і вище для Windows 9x. Дана програма компілювати з використанням Borland C + + 3.1.Компілія програми у версіях Borland C + + сконфігурованих під Windows (таких як Borland C + +4.5, Borland C + +5.2 і вище) не можлива так як графічний режим [2] функціонує лише у версіях сконфігурованих під DOS.

Програма не вимагає від Користувачем введення масиву для його сортування. Цей масив створюється спеціальною функцією мови Сі - генератор випадкових чисел [3]. Програма була розроблена на компьюторе з низькою тактовою частотою (75MГц). А так як у програмі використовується секундомір, то тактова частота компьютора, на якому демонструється програма, впливає на точність виведених результатів. Тому не радиться користуватися нею на комп'ютер з тактовою частотою вище 150МГц. Хоча в іншому випадку швидкість сортування значіельно збільшується.

Лістинг програми наведено в додатку 1.

Програма не передбачена для роботи в режимі командного рядка. Якщо вводиться користувачем функціональна клавіша не передбачена програмою, то вона виконуватися не буде до тих пір, поки користувач не введе відповідний символ. Якщо програма не знаходить деяких потрібних для її виконання файлів, то видається вікно повідомлення про помилку з текстом причини. Функція error () викликається скрізь, де з'являється помилка. (Створює вікно повідомлення). У разі необхідності програму можна зупинити в будь-якому місці її виконання наступними комбінаціями клавіш: Ctrl C або Alt X.

Виклик програми здійснюється шляхом запуску файлу test.exe, при цьому програма буде працювати в інтерактивному режимі.
Вікно допомоги програми містить: назву програми, дані про розробника, призначення, функціональні клавіші використовуються в програмі, і можливі проблеми при її виконанні.
3.3 КЕРІВНИЦТВО ОПЕРАТОРА

Основною функцією цієї програми є визначення часу сортування масивів методами швидкої і злиттям. Шляхом незначних змін у програмі, можна пристосувати програму спеціально для сортування масивів. Дана програма (test.exe) є єдиним виконуваним модулем і не вимагає наявності будь-яких інших встановлених програмних засобів. Вона так само не вимагає установки на комп'ютер, яких би то не було специфічних апаратних засобів.

Контрольний приклад виконання програми наведено в додатку 2.

Програма може працювати лише в інтерактивному режимі. Сортування масиву з великим числом елементом на сучасному комп'ютері займе всього кілька секунд і залежить від розміру сортованого масиву.

Після завантаження програми оператору буде запропоновано натиснути необхідну клавішу для продовження виконання програми, для виведення інформації про програму або для виходу. Якщо програма не містить файлу text.hlp або не Найдан драйвер EGAVGA.BGI, то програма видає вікно повідомлення про помилку. Якщо програма містить всі необхідні елементи, то вона видасть вікно повідомлення відповідь про можливість виконання аналізу сортування. Якщо програма отримала дозвіл на початок процесу сортування, то вона виконує його і після завершення виводить на екран в графічному режимі результати про аналізі сортувань. У разі необхідності програму можна зупинити в будь-якому місці її виконання наступними комбінаціями клавіш: Ctrl C або Alt X. У такому разі програма не виконає ніяких дій.

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

ВИСНОВОК
В результаті виконання курсового проекту була написана програма, що аналізує сортування масивів способами швидкої і злиттям. Програма володіє високим параметром швидкодії, маленьким розміром і не вимоглива до системних ресурсів комп'ютера. Як недолік програми можна віднести те, що точність виконання програми залежить від тактової частоти комп'ютера. Цей недолік можна вирішити шляхом зміни кількості сортируемих елементів масиву. Програма може бути перетворена для використання з метою сортування масивів вводяться користувачем.

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Шолмов Л.І. Посібник з турбо Сі. М.: Наука, 1994. - 94-98с.
2. Уінер Р. Мова Турбо Сі: Пер. з англ. -М.:: Світ, 1991. - 384 с.
3. Керніган Б.В, Річі Д.М. Сі для професіоналів. М.: Енергія, 1996 .- 213 с.
4. Грейд Дж. Математичне програмування. М.: Наука, 1987. - 241 с.
5. Ліберман М. Алгоритми сортування масивів. М.: Наука, 1997. - 43-81С.

Додаток 1
Лістинг програм
/ / Лістинг програми сортування масивів розроблена Андрусевич Б.І.
# Include <stdio.h>
# Include <dos.h>
# Include <graphics.h>
# Include <stdlib.h>
# Include <conio.h>
# Include <string.h>
# Include <time.h>
//-------------< Створення оболонки >-------------
void windows (int w)
{
int n;
_setcursortype (0);
window (1, 1, 80, 25); / / Виділення вікна
textbackground (BLACK); / / Колір фону
clrscr (); / / Очищення екрану
window (1, 25, 80, 25); / / Виділення вікна
textbackground (GREEN); / / Колір фону
clrscr (); / / Очищення екрану
window (1, 25, 80, 25);
textcolor (BLACK); / / Колір тексту
if (w == 1) / / Перевірка на вибір вікна
{
n = 21;
cprintf ("Допомога Тест Вихід");
window (2, 25, 4, 25);
textcolor (RED); / / Керуючі клавіші
cprintf ("F1"); / / основного вікна
window (13, 25, 15, 25);
cprintf ("F2");
window (22, 25, 25, 25);
cprintf ("F10");
textbackground (BLUE);
}
else
{
n = 22;
cprintf ("Вихід з допомоги");
window (3, 25, 6, 25);
textcolor (RED); / / Керуючі клавіші
cprintf ("Esc"); / / вікна допомоги
textbackground (CYAN);
}
window (1, 1, 80, 25); / / Промальовування рамки
textcolor (WHITE);
cprintf ("+------------------------------------ Тест --------- ---------------------------+");
for (int k = 0; k <n; k + +)
cprintf ("| |");
cprintf ("+---------------------------------------------- --------------------------------+");
if (w == 1)
{
window (2, 2, 79, 2);
puts ("Ця програма демонструє сортування масиву двома методами:");
window (2, 3, 79, 3);
puts ("швидким методом і методом злиття. Після чого визначається час сор-");
window (2, 4, 79, 4);
puts ("вання масиву кожним методом і результат виводиться у вигляді гісто-");
window (2, 5, 79, 5);
puts ("грами.");
window (2, 6, 79, 6);
window (20, 10, 60, 15);
textcolor (WHITE);
textbackground (LIGHTGRAY);
cprintf ("+---------------------------------------------- --------------------+");
cprintf ("| НЕОБХІДНІ ФАЙЛИ ПРИСУТНІ |");
cprintf ("| (для тестіровнія натисніть F2) |");
cprintf ("+---------------------------------------------- --------------------+");
closegraph ();
}
}
//------------< Вікно повідомлення помилок >-----------
void Error ()
{
window (20, 10, 60, 15);
textcolor (WHITE);
textbackground (LIGHTGRAY);
cprintf ("+----------------- Помилка ----------------+");
cprintf ("| |");
cprintf ("| |");
cprintf ("| |");
cprintf ("+---------------------------------------------+ ");
}
//-------------< Функція допомоги >----------------
help ()
{
int n = 1;
FILE * hl; / / Покажчики на файл
char string [78];
if ((hl = fopen ("test.hlp", "r"))! = NULL) / / Перевірка на відкриття файлу
{
windows (0);
window (2, 2, 78, 23);
textcolor (BLACK);
while (fgets (string, 78, hl)! = NULL & & n <23)
{
gotoxy (1, n + +); / / Порядковий висновок файлу
cputs (string); / / допомоги
}
window (36, 1, 44, 1);
printf ("Допомога"); / / Висновок заголовка допомоги
while (27! = getch ());
}
else {
Error ();
window (29, 12, 52, 12);
textcolor (BLACK);
cprintf ("Файл TEST.HLP не знайдено");
getch ();
windows (1);
}
fclose (hl);
windows (1);
return 0;
}
//--------< Функція побудови гістограм >-------
grafix (double simvol [2])
{
double CopySimvol [2]; / / Масив кількості символів
long float max = 0;
int gdriver = DETECT, gmode, errorcode;
int midx = 50; / / Оголошення змінних
int midy = 410; / / із заданими початковими
int i, s; / / значеннями
int siz = 100;
int otst = 10;
int rovn = 45;
char chis [2];
char buf [10];
initgraph (& gdriver, & gmode, "");
errorcode = graphresult (); / / Запис код помилки
if (errorcode! = grOk) / / Перевірка на помилку
{
Error (); / / Виклик функції вікна
window (26, 12, 54, 12);
textcolor (BLACK);
cprintf ("Драйвер EGAVGA.BGI не знайдено");
getch ();
windows (1);
return 0;
}
for (int y = 0; y <2; y + +) / / оприделения максимального
if (max <simvol [y]) / / числа
max = simvol [y];
for (int b = 0; b <2; b + +) / / оприделения висоти стовпців
CopySimvol [b] = simvol [b] * 200 / max;
setfillstyle (CLOSE_DOT_FILL, 9);
for (int n = 0; n <2; n + +) / / Побудова стовпців і ліній
{
setcolor (BLUE);
bar3d (midx + otst + siz * n, midy - CopySimvol [n], midx + siz * (n +1), midy, 15, 1);
setcolor (BROWN);
line (midx + rovn + siz * n, midy + otst, midx + rovn + siz * n, midy + otst * 2);
sprintf (chis, "% d", n + 1);
setcolor (GREEN);
outtextxy ((midx + rovn + siz * n) - 2, midy + otst * 2, chis);
setcolor (CYAN);
sprintf (buf, "% lf", simvol [n]);
outtextxy ((midx + rovn + siz * n) - 15, midy - CopySimvol [n] - rovn, buf);
}
setcolor (BROWN);
line (midx, 100, midx, midy + otst); / / Побудова осі Y
line (midx, midy + otst, 280, midy + otst); / / Побудова осі X
line (midx - otst, midy - 200, midx, midy - 200); / / Побудова
line (midx - otst, midy - 100, midx, midy - 100); / / лінії
settextstyle (DEFAULT_FONT, HORIZ_DIR, 1);
setcolor (GREEN);
outtextxy (535, 460, "ESC");
outtextxy (10, 205, "100");
outtextxy (10, 305, "50");
outtextxy (350, 235, "1. Сортірвка масиву швидких");
outtextxy (350, 250, "методом");
outtextxy (350, 280, "2. Сортірвка масиву методом");
outtextxy (350, 295, "злиття");
setcolor (LIGHTBLUE);
outtextxy (300, 423, "метод");
outtextxy (570, 460, "Вихід");
settextstyle (DEFAULT_FONT, HORIZ_DIR, 2);
outtextxy (220, 30, "Гістограма");
settextstyle (DEFAULT_FONT, VERT_DIR, 1);
outtextxy (48, 160, "час");
while (27! = getch ()); / / Перевірка на символ ESC
closegraph ();
windows (1);
return 0;
}
/ * Qsort: сортує v [left] ... v [right] за зростанням * /
void qqsort (int v [], int left, int right)
{
int i, last;
delay (1);
void swap (int v [], int i, int j);
if (left> = right) / * нічого не робиться якщо * /
return; / * у масиві менше двох ел-тів * /
swap (v, left, (left + right) / 2); / * ділив ел-нт переноситься в v [0] * /
last = left;
for (i = left +1; i <= right; i + +) / * розподіл на частини * /
if (v [i] <v [left]) swap (v, + + last, i);
swap (v, left, last) / * перезапомінается ділив елемент * /
qqsort (v, left, last-1);
qqsort (v, last +1, right);
}
void swap (int v [], int i, int j)
{
long int temp;
temp = v [i];
v [i] = v [j];
v [j] = temp;
}
/ * SRECMG - Рекурсивні сортування злиттям * /
void srecmg (a, n)
int a [], n;
{
void merge (int *, int, int);
int i;
delay (1);
if (n> 1)
{I = n / 2; srecmg (a, i); srecmg (a + i, ni); merge (a, i, n);}
}
/ * Merge - злиття двох підсписків * /
# Define MAX (x, y) ((y) <(x)? (X): (y))
void merge (int * w, int l1, int l2)
{
int * a, * pa, * pb, i;
a = (int *) calloc (l2 +2, sizeof (int));
pa = a; pb = a + l1 +1;
for (i = 0; i <l1; i + +) * pa + + = w [i];
for (i = l1; i <l2; i + +) * pb + + = w [i];
* Pa =* pb = MAX (w [l1-1], w [l2-1]) +1;
pa = a; pb = a + l1 +1;
for (i = 0; i <l2; i + +)
w [i] = (* pa <* pb? * pa + +: * pb + +);
free (a);
}
# Define ww 700
//-------< Функція виклику різних методів >-------
file ()
{Void qqsort (int *, int, int);
void srecmg (int *, int);
double simvol [2];
int s;
clock_t start, start2, end, end2; int t = 0;
int gener1 [ww], gener2 [ww]; / / Генератор випадкових чисел
randomize (); / / Встановлює генератор в 0
for (s = 0; s <ww; s + +)
{Gener1 [s] = (rand ()% 100); / / rand ()-функція генератора
gener2 [s] = gener1 [s];
}
{Start = clock ();
qqsort (gener1, 0, ww-1);
end = clock ();
simvol [0] = ((end - start) / CLK_TCK);
}
{Start2 = clock ();
srecmg (gener2, ww);
end2 = clock ();
simvol [1] = ((end2 - start2) / CLK_TCK);
}
grafix (simvol); / / Виклик функції побудови гістограм
windows (1);
return 0;
}
//-------------------< Меню >--------------------
void main ()
{
char divss;
windows (1);
while (1)
{
divss = getch (); / / Опитування клавіатури
switch (divss)
{
case 59: help (); break; / / Виклик помоши
case 60: file (); break; / / Запуск гістограми
case 68: {/ / Вихід з програми
window (1, 1, 80, 25);
textbackground (BLACK);
clrscr ();
exit (1);
}}}}

Додаток 2

КОНТРОЛЬНИЙ ПРИКЛАД ВИКОНАННЯ ПРОГРАМИ
Як приклад візьмемо вихідний файл "Test.exe" і запустимо його. На екрані з'являється вікно собщения про наявність необхідних файлів. Для продовження виконання програми користувач натискає клавішу F 2, в результаті чого на екрані з'являється гістограма, що характеризує швидкість виконання сортування масивів. Скориставшись клавішею Esc, користувач виходить з графічного режиму в режим відображення меню. При натисканні користувачем клавіші F 1 на екрані з'являється вікно допомоги яке містить назву програми, дані про розробника, призначення, функціональні клавіші використовуються в програмі, і можливі проблеми при її виполненіі.Нажатіе клавіші Esc призводить до закриття вікна допомоги. Для виходу з програми користувач повинен натиснути клавішу F 10.

Приклад виведеної гістограми.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
87.8кб. | скачати


Схожі роботи:
Методи внутрішнього сортування Обмінна сортування Порівняння з іншими методами сортування
Методи сортування Їх порівняльний аналіз
Порівняльний аналіз ефективності та складності швидких алгоритмів сортування масивів
Порівняльний аналіз ефективності та складності алгоритмів сортування файлів і послідовностей
Порівняльний аналіз ефективності та складності прямих алгоритмів сортування масивів
Аналіз методів збільшення прибутку
Порівняльний аналіз методів оптимізації
Аналіз сучасних методів навчання у ВНЗ
Порівняльний аналіз методів господарського обліку
© Усі права захищені
написати до нас