МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра автоматизовані
системи управління
КУРСОВА РОБОТА
з дисципліни:
“Проблемно-орієнтовані мови програмування”
на тему:
“Сортування за методом вставок та методом
Шелла”
ЗМІСТ
Вступ ……………………………………………………………………….
Огляд літератури………………………………………………………….
Формулювання задачі…………………………………………………….
Алгоритм розв’язання …………………………………………………...
Програмні реалізації програми ………………………………………..
Загальна характеристика програми…………………………………...
Призначення програми ………………………………………………..
Вхідна інформація……………………………………………………...
Результуюча інформація……………………………………………….
Структура програми…………………………………………………....
Таблиця ідентифікаторів програми…………………………………...
Середовище реалізації програм……………………………………….
Технологія виконання та від лагодження програми……………….....
Інструкція користувачеві програми…………………………………….
Контрольні приклади та аналіз їх реалізації висновки……………….
Список літератури………………………………………………………….
Додатки ……………………………………………………………………...
Вступ
В наш час нові інформаційні технології посідають дуже важливе місце не лише в спеціалізованих, але й в повсякденних сферах життя. Комп’ютери застосовуються в бізнесі, менеджменті, торгівлі, навчанні та багатьох інших сферах діяльності людини.
Комп’ютерні технології дуже зручні для виконання різноманітних операцій, але в різних сферах застосування ці операції різні. Тому, кожна окрема галузь, яка використовує специфічні технічні засоби, потребує своїх власних програм, які забезпечують роботу комп’ютерів.
Розробкою програмного забезпечення займається така галузь науки, як програмування. Вона набуває все більшого й більшого значення останнім часом, адже з кожним днем комп’ютер стає все більш необхідним, все більш повсякденним явищем нашого життя. Адже обчислювальна техніка минулих років вже майже повністю вичерпала себе і не задовольняє тим потребам, що постають перед людством.
Таким чином, нові інформаційні технології дуже актуальні в наш час і потребують багато уваги для подальшої розробки та вдосконалення. Поряд з цим, велике значення має також і програмування, яке є одним із фундаментальних розділів інформатики і тому не може залишатись осторонь.
Програмування містить цілу низку важливих внутрішніх задач. Однією з найбільш важливих таких задач для програмування є задача сортування. Під сортуванням звичайно розуміють перестановки елементів будь-якої послідовності у визначеному порядку. Ця задача є однією з найважливіших тому, що її метою є полегшення подальшої обробки певних даних і, насамперед, задачі пошуку. Так, одним з ефективних алгоритмів пошуку є бінарний пошук. Він працює швидше ніж, наприклад, лінійний пошук, але його можливо застосовувати лише за умови, що послідовність вже упорядкована, тобто відсортована.
Взагалі, відомо, що в будь-якій сфері діяльності, що використовує комп’ютер для запису, обробки та збереження інформації, усі дані зберігаються в базах даних, які також потребують сортування. Певна впорядкованість для них дуже важлива, адже користувачеві набагато легше працювати з даними, що мають певний порядок. Так, можна розташувати всі товари по назві або відомості про співробітників чи студентів за прізвищем або роком народження, тощо.
Задача сортування в програмуванні не вирішена повністю. Адже, хоча й існує велика кількість алгоритмів сортування, все ж таки метою програмування є не лише розробка алгоритмів сортування елементів, але й розробка саме ефективних алгоритмів сортування. Ми знаємо, що одну й ту саму задачу можна вирішити за допомогою різних алгоритмів і кожен раз зміна алгоритму приводить до нових, більш або менш ефективних розв’язків задачі. Основними вимогами до ефективності алгоритмів сортування є перш за все ефективність за часом та економне використання пам’яті. Згідно цих вимог, прості алгоритми сортування (сортування включенням) не є дуже ефективними.
Важко собі уявити, як користуватися списками об'єктів, якщо інформація в них би не була відсортована. Процесом сортування називають дії по впорядкуванню деяких даних (таблицю) по ключу. Ключі можуть бути різними. Наприклад, перетворити:
Таблицю чисел за збільшенням;
Таблицю прізвищ - за абеткою, причому тільки по першій букві
Очевидно, що з "відсортованими даними" працювати легше і швидше, ніж з довільно розташованими. Коли елементи "відсортовані", простіше знайти, наприклад, телефон товариша в телефонній книзі на 500 сторінок, швидше знайти слово в словнику на 700 сторінок.
Всі ЕОМ засновані на здібності до швидкої і точної обробки великих об'ємів інформ Отже, без розуміння інформаційної сутності таблиць і основних алгоритмів їх обробки неможливе формування повноцінних уявлень про можливості ЕОМ і принципи їх роботи.Для побудови скільки-небудь складних і змістовних програм необхідне упевнене володіння загальними принципами застосування таблиць і базовими прийомами їх обробки.
Тому темою даної роботи є демонстрація сортування методоми вставок і Шелла.
Метою створити програму для ефективного подання принципів роботи алгоритму сортування.
Перед розробкою роботи були поставленні завдання:
Створити програму для демонстрації сортування
методами вставок і Шелла.
Розглянути існючі методи сортування.
Огляд літератури
Алгоритм сортування — це алгоритм, що розв'язує задачу сортування, тобто здійснює впорядкування лінійного списку (масиву) елементів.
Постановка задачі
Вхід алгоритму: послідовність з n чисел
Вихід алгоритму: перестановка вхідної послідовності таким чином, що ( — перестановка послідовності чисел 1...n).
Вхідна послідовність найчастіше представляється у вигляді n-елементного масиву, хоча може мати й інше представлення, наприклад, у вигляді зв'язного списку.
Вхідна послідовність: (5, 6 ,1 ,8 ,5 ,7, 4)
Вихідна послідовність: (1, 4, 5, 5, 6, 7, 8)
Характеристики алгоритмів
Для алгоритму сортування (як і для будь-якого іншого сучасного алгоритму) основними характеристиками є: час необхідний на впорядкування n-елементного масиву і додаткова пам'ять необхідна для впорядкування. Крім цих двох характеристик, сортування буває стабільним чи нестабільним, з використанням додаткової інформації про елементи, чи без використання.
Для значної кількості алгоритмів середній і найгірший час впорядкування n-елементного масиву є , це пов'язано з тим, що в них передбачені перестановки елементів, що стоять поряд (різниця між індексами елементів не перевищує деякого заданого числа). Такі алгоритми зазвичай є стабільними, хоча і не ефективними для великих масивів.
Інший клас алгоритмів здійснює впорядкування за час . В цих алгоритмах використовується можливість обміну елементів, що знаходяться на будь-якій відстані один від одного.
Теорема про найкращий час сортування
Якщо алгоритм сортування в своїй роботі спирається тільки на операції порівняння двох об'єктів (≤) і не враховує жодної додаткової інформації про елементи, то він не може впорядкувати масив елементів швидше ніж за в найгіршому випадку.
Доведення
На кожному кроці алгоритм проводить одне порівняння, результатом якого є один з двох варіантів:
В залежності від результату порівняння алгоритм буде робити подальші дії. Отже, всю роботу алгоритму можна представити у вигляді бінарного дерева в листах якого лежать можливі перестановки вхідного масиву.
Отже, дерево має n! листів, а висота дерева є log(n!). Час роботи в найгіршому випадку пропорційний висоті дерева:
Ці швидкі алгоритми використовуються в реальних задачах. Проте більшість з них нестабільні. Стабільні алгоритми, що працюють за час , потребують додаткової пам'яті.
Відомий стабільний алгоритм сортування, що не вимагає додаткової пам’яті, працює за час
Ще один клас алгоритмів використовує в своїй роботі деяку додаткову інформацію про елементи, що впорядковуються (наприклад, те що вони є різними числами в деякому діапазоні). Завдяки цьому, вони працюють за час .
Відомі алгоритми сортування
За час
сортування вибором
сортування вставкою
сортування обміном
За час
пірамідальне сортування
швидке сортування
сортування злиттям
За час з використанням додаткової інформації про елементи
сортування підрахунком
сортування за розрядами
сортування комірками
За час
сортування злиттям модифіковане
сортування Шелла.
В своїй курсовій роботі я повинен реалізувати сортування:Шелла і методом вставок.
Сорування Шелла.
Сортува́ння Ше́лла — це алгоритм сортування, що є узагальненням сортування включенням.
Алгоритм базується на двох тезах:
Сортування включенням ефективне для майже впорядкованих масивів.
Сортування включенням неефективне, тому що переміщує елемент тільки на одну позицію за раз.
Тому сортування Шелла виконує декілька впорядкувань включенням, кожен раз порівнюючи і переставляючи елементи, що знаходяться на різній відстані один від одного.
Сортування Шелла не є стабільним.
Історія
Сортування Шелла названо начесть автора — Дональда Шелла, який опублікував цей алгоритм у 1959 році. В деяких пізніших друкованих виданнях алгоритм називають сортуванням Шелла-Мацнера, за ім'ям Нортона Мацнера. Але сам Мацнер стверджував: «Мені не довелось нічого робити з цим алгоритмом, і моє ім'я не має пов'язуватись з ним».
Ідея алгоритму
На початку обираються m-елементів: , причому, .
Потім виконується m впорядкувань методом включення, спочатку для елементів, що стоять через , потім для елементів через і т. д. до .
Ефективність досягається тим, що кожне наступне впорядкування вимагає меншої кількості перестановок, оскільки деякі елементи вже стали на свої місця.
Сортування методом Шелла полягає в наступному: спочатку окремо групуються і сортуються елементи, віддалені один від одного на відстані 9. Після першого проходу елементи перегруповуються і знову сортуються елементи, віддалені один від одного на відстані 5, потім сортуються елементи,. віддалені один від одного на відстані 3, і нарешті, на четвертому проході йде звичайна або одинарна сортування.
Псевдокод
Сам алгоритм не залежить від вибору m і d, тому будемо вважати, що вони задані.
1. for to
2. do for to
3. do
4.
5. while і
6. do
7.
8.
Корректність алгоритма
Оскільки то на останньому кроці виконується звичайне впорядкування включенням всього масиву, а отже кінцевий масив буде впорядкованим.
Час роботи
Час роботи залежить від вибору значень елементів масиву d. Існує декілька підходів вибору цих значень:
При виборі час роботи алгоритму, в найгіршому випадку, є .
Якщо d — впорядкованний за спаданням набір чисел виду , то час роботи є .
Якщо d — впорядкованний за спаданням набір чисел виду , то час роботи є .
Приклад роботи
Проілюструймо роботу алгоритму на вхідному масиві A = (5,16,1,32,44,3,16,7), d = (5,3,1).
Масив після впорядкування з кроком в 5: (3,16,1,32,44,5,16,7) — зроблено 1 обмін.
Масив після впорядкування з кроком 3: (3,7,1,16,16,5,32,44) — зроблено 3 обміна.
Масив після впорядкування з кроком 1: (1,3,5,7,16,16,32,44) — зроблено 5 обмінів.
Отже, весь масив впорядковано за 8 операцій обміну.
Взято з сайту: http://uk.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%A8%D0%B5%D0%BB%D0%BB%D0%B0
Сортування методом вставок
Сортування включенням — простий алгоритм сортування на основі порівнянь. На великих масивах є значно менш ефективним за такі алгоритми, як швидке сортування, пірамідальне сортування та сортування злиттям. Однак, має цілу низку переваг:
простота у реалізації
ефективний (за звичай) на маленьких масивах
ефективний при сортуванні масивів, дані в яких вже непогано відсортовані: продуктивність рівна O(n + d), де d — кількість інверсій
на практиці ефективніший за більшість інших квадратичних алгоритмів (O(n2)), як то сортування вибором та сортування бульбашкою: його швидкодія рівна n2/4, і в найкращому випадку є лінійною
є стабільним алгоритмом
В сортуванні бульбашками можна чітко сказати,що на і-му кроці елементи a[0]…a[i] стоять на правильних місцях і нікуди більше не змістяться.Тут схоже твердження буде слабким:послідовність a[0]…a[i] впорядкована.При цьому в ході алгоритму в неї будуть вставлятися нові елементи.
Розглядаємо дії на і-му кроці.Як було сказано вище,послідовність до цього моменту була розділена на 2 частини: готову a[0]…a[i] і невпорядковану a[i+1]…a[n].
На наступному, (і+1)-му кожному кроці алгоритму a[i+1] і вставляємо на потрібне місце в готову частину масиву.
Пошук потрібного місця для наступного елемента вхідної послідовності здійснюється шляхом послідовних порівнянь з елементом,котрий стоїть перед ним.В залежності від результату порівняний елемент або залишається на поточному місці(вставка завершена), або вони міняються місцями і процес повторюється.
Таким чином, в процесі вставки ми "просіюємо" елемент x на початок масиву, зупиняючись у разі, коли
1. Знайдений елемент, менший x або
2. Досягнутий початок послідовності
template<class T>
void insertSort(T a[], long size) {
T x;
long i, j;
for ( i=0; i < size; i++) { // цикл проходів, i - номер проходу
x = a[i];
// пошук місця элемента в готовій послідовності
for ( j=i-1; j>=0 && a[j] > x; j--)
a[j+1] = a[j]; // зсуваєм елемент направо, покаи не дойшли
// місце знайдено, встаити элемент
a[j+1] = x;
}
}
Взято з сайту: http://algolist.manual.ru/sort/insert_sort
ФОРМУЛЮВАННЯ ЗАДАЧІ
Задача входить до класу задач на сортування.
1.Метою задачі:
-сортування масивів цілих та дійсих чисел.
-сортування стовпчиків двовимірних масивів цілих та дійсних чисел.
-дані опрацьовувати та зберігати в динамічній пам'яті.
2.Розробити інтерфейс користувача.
3.Середовище функціонування програми MS-DOS.
Набір повинен бути з клавіатури :масив чисел по одному числі через пробіл.Числа можуть бути як дійсні,так і цілі.
В результаті буде виведений посортований масив.
АЛГОРИТМ РОЗВ’ЯННЯ ЗАДАЧІ
В алгоритмі задачі є побудовані блок-схеми до оснoвних функцій сортування.
Функція сортування методом вставок
i=0,n
j=j-1,j>=0,
a[j]>x
i=0,n
j=j-1,j>=0,
a[j]>x
кінець.
Функція сортування методом Шелла.
h=1,n/9
h=,h>0
i=h,n
j=i-h,
j>=0
так
ні
j=i-h,j>0
i=h,n
h=,h>0
h=1,n/9
кінець
Алгоритм розв’язку задачі.
1.Даю вибір користувачеві обрати тип сортування.Це роблю в програмі за допомогою
функції switch( ).
2.якщо користувач обрав тип сортування йому буде надана можливість ввести
кількість чисел в масиві,і ввести ці числа
3.Коли все введено підключаються функції сортування,які подані вище.
4.Виводиться посортований масив.
Умовні позначення
-- Початок циклу.
-- Кінець циклу
-- Присвоєння елементів
-- Розгалуження.
ПРОГРАМНІ РЕАЛІЗАЦІЇ АЛГОРИТМУ
Загальна характеристика програми.
Програма має назву Sort.
Програма написана на мові С.
Розмір у байтах -
Розмір у рядках-
Призначення програми
Ця програма входить до класу задач сортування чисел в одновимірних та двовимірних масивах.
За допомогою цієї програми можна сортувати числа:цілі та дійсні.
В цієї програми обмеження на числа ,які більші ніж 1027.
Програма зчитує дані тільки з клавіатури.
Вхідна інформація
Вхідні дані числа цілі й дійсні.
Дані вводяться з клавіатури.
Кількість даних вказує користувач.
В програмі контролюється числове введеня: вибору сортування,вибору кількості елементів.В разі неправильного введення користувачу буде надана спроба на введення.
Вхідні дані заносяться у програму за допомогою функцій:
Scanf(),gets().
Результуюча інформація
Вся інформація подається на екран за допомогою функцій:printf(),puts(),outtextxy().
Титульна сторінка зроблена за допомогою функції outtextxy().
Вивід результату сортування зроблений за допомогою функції printf().
Допоміжні підказки зроблені за допомогою функції puts().
Структура програми
Бібліотечні функції та стандартні заголовні файли:
#include <stdio.h>;
#include<conio.h>;
#include<stdlib.h>;
#include<graphics.h>;
puts();Дана функція послідовно зчитує всі символи, введені з клавіатури (у загальному випадку – зі стандартного потоку введення stdin), і записує їх у масив, адреса початку якого задається параметром-вказівником st. Ознакою кінця введення служить символ нового рядка '\n' (він заноситься у буфер введення при натискуванні на Enter ) – замість нього функція записує у рядок кінцевий нуль-символ '\0'.
У разі успішного завершення gets() повертає вказівник на початок введеного рядка, тобто, адресу першого символа рядка – &st[0], а в разі виникнення помилки – пустий вказівник NULL.
Дуже важливо, щоб розмір масиву st був достатнім для введення всіх символів рядка. Функція не контролює кількість зчитаних символів, тому в разі переповнення st результат роботи програми буде непередбачуваним.
gets();Єдиним параметром функції є st – вказівник на початок рядка, який має бути виведений на екран. Функція повертає невід’ємне значення у разі успішного виконання, а в разі помилки – макроконстанту EOF.
Рядок, що виводиться, повинен обов’язково закінчуватись нуль-символом, інакше після символів рядка будуть виводитись у формі символів значення всіх наступних байтів оперативної пам’яті, поки не зустрінеться байт зі значенням 0. Сам нуль-символ '\0' функція замінює символом нового рядка '\n', тобто, після виведення всіх символів заданого стрінга екранний курсор завжди переводиться на початок нового рядка. Виклик функції puts() з параметром – пустим рядком:
puts("");
використовують для переведення курсора на новий рядок у процесах виведення даних.
scanf(); Форматне введення даних із стандартного вхідного потоку stdin (переважно він пов’язаний з клавіатурою) виконує ця функція:
яка послідовно читає введені символи, формує з них поля введення (вхідні дані), інтерпретує ці дані, перетворює їх у двійкову форму відповідно до заданих у рядку формату специфікацій та записує отримані значення у змінні, адреси яких задані у списку введення. Функція scanf() забезпечує введення даних усіх числових типів (як цілих, так і дійсних), а також окремих символів і символьних рядків, хоча здебільшого її використовують для введення саме числових даних.
printf(); Форматне виведення заданої інформації на екран виконує функція: яка перетворює значення виразів, заданих у списку виведення, згідно специфікацій, записаних у рядку формату, і передає результат перетворення у стандартний вихідний потік stdout – здебільшого цей потік пов’язаний з виведенням на екран. Функція повертає результуюче значення з типом int: у разі успішного завершення це значення буде рівним загальній кількості виведених символів, а в разі виникнення помилки результуюче значення – від’ємне.
Перший параметр функції printf() – рядок_формату є символьним рядком, до складу якого можуть входити три групи символів:
звичайні ASCII-символи – вони виводяться без змін;
керуючі символи (ескейп-послідовності) – виконують відповідну дію;
cпецифікації формату – задають інтерпретацію і форму зображення відповідного параметра із списку виведення, значення цього параметра буде підставлене замість специфікації формату в рядок виведення.
insert_sort();власна функція сортування.
shell_sort();власна функція сортування.
outtextxy();виводить текст за заданими координатами.
setbkcolor();встановлює колір фону.
setcolor(); встановлює колір.
switch();Цей оператор часто називають перемикачем. Він призначений для вибору одного з можливих варіантів розгалуження процесу розв’язання задачі. Загальна структура оператора switch така:
switch ( вираз ) {
case конст_1: оператори
case конст_2: оператори
. . .
case конст_k: оператори
default: оператори
}
Вираз, записаний в заголовку switch, може бути довільним виразом, що має цілочисельне значенням. Кожен варіант вибору починається службовим словом case, за яким вказується константа вибору (її ще називають міткою) даного варіанту: конст_1, конст_2, ... конст_k. Мітки можуть бути константами або константними виразами, що мають цілочисельне чи символьне значення. Порядок запису варіантів вибору довільний, але значення всіх констант вибору повинні бути різними. Остання вітка оператора switch, яка починається службовим словом default, є необов’язковою. Завершується оператор закриваючою фігурною дужкою, після якої ; не ставиться.
Оператор switch виконує наступні дії:
обчислюється значення виразу;
це значення послідовно порівнюється зі значенням констант вибору: конст_1, конст_2, ... конст_k – доки не буде знайдено відповідну константу;
якщо знайдено варіант, константний вираз якого співпадає зі значенням виразу, то виконуються оператори даного варіанту і всі наступні внутрішні оператори switch;
якщо значення виразу не співпадає ні з однією з констант вибору, а до складу switch входить варіант default, то виконуються оператори даного варіанту;
якщо ж в операторі немає міток, які співпадають зі значенням виразу вибору і відсутній варіант default, то ні один із внутрішніх операторів не виконується, а керування передається оператору, наступному за switch.
malloc(). Основною функцією виділення динамічної пам’яті є функція:
void * malloc (size_t msize);
Функція malloc() має один параметр msize, що задає розмір (у байтах) неперервної ділянки, яка повинна бути виділена в динамічній пам’яті. Тип size_t використовується в оголошеннях багатьох функцій мови C, його вводять (декларують через typedef у заголовних файлах), щоб забезпечити універсальність і мобільність оголошень. У даному випадку він задає один із цілочисельних беззнакових типів – залежно від умов компіляції це може бути unsigned int або unsigned long. У разі успішного виконання функція malloc() повертає адресу першого байта ділянки заданого розміру, виділеної у динамічній пам’яті. Якщо ж вільної пам’яті недостатньо, то функція повертає NULL (пустий вказівник – нульову адресу).
Середовище реалізації програми
Середовище реалізації програми операційні системи:MS-DOS ТА WINDOWS XP.
Програма BORLAND C.
Технологія виконання та відлагодження програми
Для відлагодження програми я використовував функцію watch,я в цю функцію заносив змінні котрі некоректно працювали,і за допомогою клавіші F7 покроково
проходив програму ,і дивився як змінюється ці змінні,та виправляв помилки.
Контрольні приклади та аналіз їх реалізацій
1.Запуск програми,початкова титульна сторінка.
2.Меню вибору сортування.
3. В разі помилкового натискання клавіші користувачу буде надана ще одна спроба.
4.Вводимо кількість чисел в вектор,і ці числа.
5.Вводимо матрицю. Сортуються числа в стовпчиках.
ІНСТРУКЦІЯ КОРИСТУВАЧЕВІ ПРОГРАМИ
1.Запустити програму.
2.Натиснути будь-яку клавішу.
3.Ввести з клавіатури цифру, яка стоїть біля типу сортування.
4.Робити наступні дії згідно з вказівками на екрані.
5.Після завершення всіх дій натиснути будь-яку клавішу.
ВИСНОВОК
Список літератури.
1. Керніган.Практика програмування.
2.Прата.Мова програмування.
3.Шпак.Програмування мовою С.
Додаток
#include <stdlib.h>
#include <ctype.h>
#include<conio.h>
#include <stdio.h>
#include<graphics.h>
#include<math.h>
void insert_sort(float a[],int n)
{
float x;
int i,j;
for (i=0; i<n;i++)
{
x=a[i];
for (j=i-1; j>=0 && a[j]>x;j--)
a[j+1]=a[j];
a[j+1]=x;
}
}
void shell_sort(float x[],int n)
{int h;
for( h=1;h<=n/9;h=3*h+1);
for (;h>0;h/=3)
{
for (int i=h;i<n;i++)
{
int j;
float temp=x[i];
for(j=i-h;j>=0;j-=h)
{
if(temp<x[j]) x[j+h]=x[j];
else break;
}
x[j+h]=temp;
}
}
}
int main(void)
{
int graph_driver,graph_mode,graph_error_code;
graph_driver=DETECT;
initgraph(&graph_driver,&graph_mode,"c:\\bc\bgi");
graph_error_code=graphresult();
if(graph_error_code<0)
{
cprintf("Error in BC:%s\xd\xa",grapherrormsg(graph_error_code));
return 255;
}
cleardevice();
setcolor(2);
settextstyle (0,0,2);
outtextxy (120,30,"Nationalnui yniversutet ");
outtextxy(150,50, " \"Lvivska Poliyehnika\"");
settextstyle(0,0,2);
setcolor (2);
outtextxy (120,90,"Kyrsova robota z programyvannya");
setcolor(2);
outtextxy (130,110,"na temy: Sortyvanny za metodom");
outtextxy (130,130," vstavok i metodom shella");
settextstyle(0,0,1);
setcolor(2);
outtextxy(400,400,"vukonav: stydent grypu KN-12");
outtextxy(500,420,"Heto Yuriy");
setcolor(2);
outtextxy(300,460,"Lviv-2010");
setcolor (15);
outtextxy(250,250,"dlya prodovgennya");
outtextxy(250,270, "nagmit byd yaky klavishy");
setbkcolor (8);
getch();
clrscr();
setbkcolor(8);
clrscr();
cleardevice();
setcolor(2);
outtextxy(250,15," vuberit tup sortyvannya");
settextstyle(0,0,2);
outtextxy(180,40," 1) sort vektor shella");
outtextxy(180,60," 2) sort vektor vstavkamu");
outtextxy(180,80," 3) sort matrucya shella");
outtextxy(180,100," 4) sort matrucya vstavkamu");
setcolor(4);
settextstyle(0,0,1);
outtextxy(50,380,"SHOB VUBRATU POTRIBNUI TUP SORTYVANNA VVEDIT CUFRY KOTRA SOIT BILA NOGO");
int vub1;
char vub[6];
int pe;
printf("\n\n\n\n\n\n\n\n\n\t\t\t");
// scanf ("%d",&vub);
// while ((vub<1) ||(vub>4) )
//// {
//
// printf ("pomulka!!! Vvedit she\n");
// scanf("%d\n",&vub);
// }
do
{
vub[0]=0;
scanf ("%s",&vub);
vub1=atoi(vub);
if ( vub1<1 || vub1>4 ) printf ("pomulka vvedit she");
}
while ( vub1<1 || vub1>4);
clrscr();
setbkcolor(0);
cleardevice();
switch (vub1)
{
case 1:{
int n;
printf ("vvedit k-kst elementiv");
scanf ("%d",&n);
printf ("vvedit vektor");
float *a=(float *)malloc(n*sizeof(float));
for(int i=0;i<n;i++)
scanf("%f",&a[i]);
shell_sort(a,n);
for(i=0;i<n;i++)
printf("%.2f ",a[i]);
printf("\n");
}
printf ("nagmit bud yuky klavishy");
getch();
;
break;
case 2:{ int n;
printf ("vvedit k-kst elementiv");
scanf ("%d",&n);
printf ("vvedit vektor");
float *a=(float *)malloc(n*sizeof(float));
for(int i=0;i<n;i++)
scanf("%f",&a[i]);
insert_sort(a,n);
for(i=0;i<n;i++)
printf("%.2f ",a[i]);
printf("\n");
}
printf ("nagmit bud yuky klavishy");
getch();
;
break;
case 3: {
const q=100;
int v[q];
printf("vvedit kilkist ryadochkiv matruci");
int n;
scanf("%d",&n);
printf("vvedit k-kst elementiv v ryadky matruci" );
int m;
scanf("%d",&m);
int r=n*m;
printf("n=%d\n",n);
printf("m=%d\n",m);
float *mat=(float*)malloc(n*m*sizeof(float));
printf("Input number of matrix\n");
for (int i=0;i<r;i++)
scanf("%f",&mat[i]);
int z=0;
float *a=(float *)malloc(n*m*sizeof(float));
for (z=0;z<m;z++)
{
for(i=0;i<n;i++)
a[i]=mat[z+i*m];
shell_sort(a,n);
for(i=0;i<n;i++)
mat[z+i*m]=a[i];
}
for(i=0;i<n*m;i++)
{
printf ("%.2f ",mat[i]);
if ((i+1)%m==0