НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
“КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
імені ІГОРЯ СІКОРСЬКОГО”
ЗВІТ
з лабораторної роботи №3
з навчальної дисципліни “Програмування складних алгоритмів”
Тема:
«МЕТОДИ СОРТУВАННЯ»
Варіант 13
Київ 2022
Мета: Метою лабораторної роботи є набуття практичних навичок з використання простих методів сортування.
Теоретичні відомості
Сортування вибором — простий алгоритм сортування лінійного масиву, на основі вставок. Має ефективність n2, що робить його неефективним при сортування великих масивів, і в цілому, менш ефективним за подібний алгоритм сортування включенням. Сортування вибором вирізняється більшою простотою, ніж сортування включенням, і в деяких випадках, вищою продуктивністю.
Сортування включенням або сортування вставлянням — простий алгоритм сортування на основі порівнянь. На великих масивах є значно менш ефективним за такі алгоритми, як швидке сортування, пірамідальне сортування та сортування злиттям. Однак, має цілу низку переваг:
1 - простота у реалізації
2 - ефективний (зазвичай) на маленьких масивах
3 - ефективний при сортуванні масивів, дані в яких вже непогано відсортовані: продуктивність рівна O(n + d), де d — кількість інверсій
4 - на практиці ефективніший за більшість інших квадратичних алгоритмів (O(n2)), як то сортування вибором та сортування бульбашкою: його швидкодія рівна n2/4, і в найкращому випадку є лінійною
5 - є стабільним алгоритмом.
Наприклад, більшість людей при сортуванні колоди гральних карт, використовують метод, схожий на алгоритм сортування включенням.
Сортування злиттям (англ. merge sort) — алгоритм сортування, в основі якого лежить принцип «Розділяй та володарюй».
В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву. Злиття двох упорядкованих послідовностей можна порівняти з перебудовою двох колон солдатів, вишикуваних за зростом, в одну, де вони також розташовуються за зростом. Якщо цим процесом керує офіцер, то він порівнює зріст солдатів, перших у своїх колонах і вказує, якому з них треба ставати останнім у нову колону, а кому залишатися першим у своїй. Так він вчиняє, поки одна з колон не вичерпається — тоді решта іншої колони додається до нової.
Під час сортування в дві допоміжні черги з основної поміщаються перші дві відсортовані підпослідовності, які потім зливаються в одну і результат записується в тимчасову чергу. Потім з основної черги беруться наступні дві відсортовані підпослідовності і так доти, доки основна черга не стане порожньою. Після цього послідовність з тимчасової черги переміщається в основну чергу. І знову продовжується сортування злиттям двох відсортованих підпослідовностей. Сортування триватиме доти, доки довжина відсортованої підпослідовності не стане рівною довжині самої послідовності.
/
/
Сортування вставками + додатково вибором.
/
Результат роботи
Виконання алгоритму масиву лише 10 * 10
/
Також розмірність звеличина до 1000 * 1000 для аналізу різниці швидкостей:
/
Висновки: розроблено програму, що виконує два рази той же самий алгоритм в основі якого лежить сортування, але з різницею в методах сортування. Перший раз використано алгоритм сортування вставкою, а наступний алгоритм вибором. У результаті порівняно час, затрачений на різні методи сортування, і виявилося, що сортування вставками швидше на 6 мілісекунд, ніж сортування вибором.
Програмний код
public class Lr3
{
public static void main(String[] args)
{
int side = 10;
int[][] arr = generateArr(side);
int[][] arrCopy = copyArr(arr);
System.out.println("Дано масив розмірностю " + side + ":");
displayArr(arr);
System.out.println("\nВиконання сортування вставками:");
long time = System.currentTimeMillis();
for (int j = side-1; j > 0; j--)
{
int[] subArr = new int[j];
for (int i = (side-1 - j) + 1; i < side; i++)
{
subArr[i - ((side-1 - j) + 1)] = arr[i][j];
}
insertionSort(subArr);
for (int i = (side-1 - j) + 1; i < side; i++)
{
arr[i][j] = subArr[i - ((side-1 - j) + 1)];
}
}
displayArr(arr);
System.out.println("Витрачено мілісекунд на сортування вставками (за варіантом): " + (System.currentTimeMillis() - time) + "\n");
System.out.println("Виконання сортування вибором:");
time = System.currentTimeMillis();
for (int j = side-1; j > 0; j--)
{
int[] subArr = new int[j];
for (int i = (side-1 - j) + 1; i < side; i++)
{
subArr[i - ((side-1 - j) + 1)] = arrCopy[i][j];
}
selectionSort(subArr);
for (int i = (side-1 - j) + 1; i < side; i++)
{
arrCopy[i][j] = subArr[i - ((side-1 - j) + 1)];
}
}
displayArr(arrCopy);
System.out.println("Витрачено мілісекунд на сортування вибором (додатковий): " + (System.currentTimeMillis() - time));
}
static void insertionSort(int[] arr)
{
for (int i = 1; i < arr.length; i++)
{
for (int j = i; j > 0 && arr[j] < arr[j-1]; j--)
{
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
static void selectionSort(int[] arr)
{
for (int i = 0; i < arr.length; i++)
{
int min = arr[i];
int minIndex = i;
for (int j = i; j < arr.length; j++)
{
if (arr[j] < min)
{
min = arr[j];
minIndex = j;
}
}
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
static int[][] copyArr (int[][] arr)
{
int[][] copied = new int[arr.length][arr[0].length];
for (int i = 0; i<arr.length; i++)
{
for (int j = 0; j < arr[i].length; j++)
{
copied[i][j] = arr[i][j];
}
}
return copied;
}
static int[][] generateArr(int side)
{
int[][] arr = new int[side][side];
for (int i = 0; i< side; i++)
for (int j = 0; j < side; j++)
arr[i][j] = (int)(Math.random() * 9);
return arr;
}
static void displayArr(int[][] arr)
{
for (int i = 0; i < arr.length; i++)
{
System.out.println(Arrays.toString(arr[i]));
}
}
}