Лабораторна робота 11
Тема: Сортування даних
Мета роботи: отримання практичних навичок складання і відлагодження програм сортування даних.
Теоретичні відомості
Дано множину {Аi} (i=[1;n]), елементи якої індексовано довільним чином. Небхідно індексувати {Аi} так, щоб із i < j слідувало Xi < Xj (i, j=[1;n]) (упорядкованість по зростанню) чи Xi > Xj (впорядкованість за спаданням). Процес сортування полягає у послідовних перестановках елементів множини {Аi} доти, доки їх індексація не узгодиться з їх упорядкованістю.
Сортування наданих методом обміну(метод „бульбашки”)
Основна ідея методу полягає у тому, що на кожній i-ій ітерації циклу порівнюють два сусідніх елементи Аi i Аi+1 (i=[1;n-1]). Якщо пара розташована не попорядку то елементи Ai i Ai+1 міняють місцями і реєструють факт такої перестановки. Перегляд повторюється дот тих пір, коли під час перегляду масиву від початку до кінця не буде більше перестановок.Таким чином найменший (найбільший) елемент опиниться на своєму місці у множині{Аi}.
Метод має невелику швидкодію (середня кількість порівнянь дорівнює (n*n-n)/2), є малоефективним для множин великого розміру, але має найбільш прозорий алгоритм.
Сортування наданих методом вибору
Основна ідея методу полягає у тому, що на кожній i-ій (i=[1;n-1]) ітерації зовнішнього циклу серед елементів множини {Aj} (j=[i+1;n]) шукають індекс k елементу Ak, який є найменшим (сортування по зростанню) чи найбільшим (сортування за спаданням) у порівнянні з елементом Ai і переносять цей елемент в кінець послідовності (дані Аk и Аi міняють місцями). Надалі, характерною особливістю методу є наявність двох незалежних частин послідовності – невпорядкованої (елементи, що залишилися) і впорядкованої. Метод має більшу швидкодію від попереднього, оскільки на кожній (i+1) -ій ітерації розглядається множина {X}, менша ніж на i-ій ітерації, за рахунок збільшення мінімального індексу множини на 1. Загальна кількість порівнянь наданих дорівнює n*n/2.
Сортування наданих методом включення
Основна ідея алгоритму: є впорядкована частина у яку черговий елемент поміщається (включається) так, що впорядкованість зберігається. Метод полягає у тому, що на кожній i-ій ітерації зовнішнього циклу (i=[2;n]) елемент Аi порівнюється з елементами Аj (j=[1;i-1]), і якщоАi < Аj (сортування по зростанню) чи Аi > Аj (сортування за спаданням), то елементи від Аj до Аi-1 зсувають праворуч на одну позицію, а еле-мент Аi розташовують на місці елементу Аj (таким чином елемент Xi ніби "розсовує" множину {А} з позиції j праворуч).
Кількість операцій у найгіршому випадку складає n*n/4 порівнянь і вставок. Метод можна рекомендувати для сортування малих множин.
Завдання для самостійної роботи
1. Познайомитися з задачею сортування даних
2. Вивчити основні методи сортування масивів: метод обміну, метод вибору, метод включення
3.Скласти і відлагодити окремі програми сортування даних масиву {Аi}n методами: обміну, вибору і включення.
Індивідуальне завдання синтезувати самостійно з урахуванням наступ-них вимог:
· Масив {Аi}n містить випадкові числа з інтервалу [K1;K2] кількістю у межах [10...20].
· Масив {Ai}n можна сортувати за зростанням чи за спаданням.
· Повинна бути задана нескладна умова участі елементів масиву у сортуванні (наприклад, сортування тільки елементів з парними чи непарними індексами, додатних чи від’ємних, цілих, дійсних чи текстових даних і т.д.).
Приклад виконання завдання
Елементи цілочисельного масиву {Аi}n (i=[1;n]), які є випадковими числами з інтервалу [K1;K2], відсортувати за зростанням методами обміну, вибору і включення.
// Програма сортування масиву методом обміну(метод „бульбашки)”
#include <iostream.h>
#include <conio.h>
void Sort (int A[], int n)
{ int i, found;
do {
found = 0;
for (i = 0; i <= n-1; i++)
if (A[i] > A[i+1]){
int cc= A[i]; A[i] = A[i+1]; A[i+1] = cc
found++;
}
} while (found!=0);
}
void main (void)
{ int i, Size, K1, K2;
clrscr ();
cout << endl << "Введіть розмір масиву і межі K1 та K2 змінени даних: ";
cin >> Size >> K1 >> K2;
int Array[Size];
randomize ();
for (i = 1; i <= Size; i++) Array [i] = random (K2-K1+1) + K1;
cout << endl << "Несортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
Sort (Array, Size);
cout << endl << "Сортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
}
Програма сортування масиву методом вибору
#include <iostream.h>
#include <conio.h>
void Sort (int in[]? Int n)
{
for (int i=0; i < n-1; i++) {
for(int j=i+1,k=s; j < n; j++)
if (in[j]<in[k]) k=j;
int c=in[k]; in[k]=in[i];in[i]=c;
}
}
void main (void)
{ int i, Size, K1, K2;
clrscr ();
cout << endl << "Введіть розмір масиву і межі K1 та K2 змінени даних: ";
cin >> Size >> K1 >> K2;
int Array[Size];
randomize ();
for (i = 1; i <= Size; i++) Array [i] = random (K2-K1+1) + K1;
cout << endl << "Несортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
Sort (Array, Size);
cout << endl << "Сортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
Програма сортування масиву методом включення
#include <iostream.h>
#include <conio.h>
void Sort (int in[]? Int n)
{ for (int i=1; i <= n; i++) {
int v=in[i];
for (int k=0; k<1j <=1; kj++)
if (in[k] < v) break;
for(int j=i-1;j>=k;j--)
int[j+1]=in[j];
in[k]=v;
}}
void main (void)
{ int i, Size, K1, K2;
clrscr ();
cout << endl << "Введіть розмір масиву і межі K1 та K2 зміни даних: ";
cin >> Size >> K1 >> K2;
int Array[Size];
randomize ();
for (i = 1; i <= Size; i++) Array [i] = random (K2-K1+1) + K1;
cout << endl << "Несортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
Sort (Array, Size);
cout << endl << "Сортований масив:" << endl;
for (i = 1; i <= Size; i++) cout << Array[i];
}
Контрольнi запитання
1. Сформулюйте загальну задачу сортування даних.
2. Якими експлуатаційними показниками характеризуються методи сортування даних?
3. Викладіть суть сортування даних методами: обміну, вибору і включення.
4. Дайте порівняльну характеристику методів сортування.
5. Дайте вичерпні пояснення до розроблених програм.