Вы находитесь на странице: 1из 20

Министерство Образования и Исследований

Республики Молдова
Технический Университет Молдовs

Отчет
по лабораторной работе Nr.2.
Analiza şi proiectarea algoritmilor
Тема: Методы быстрой сортировки и их сравнительный
анализ

Вариант 17

Выполнил ст.гр. TI-2210 Шологан Артемиос


Проверил ассист.универ.

Кишинев – 2023

Цель: Реализация и анализ алгоритмов сортировки


Задания к лабораторной работе.
Вариант:

Для трех любых алгоритмов сортировки записать алгоритм с помощью


псевдокода
Сортировка вставками
Insertion-Sort(A) А = (56, 83, 55, 9, 55, 1,10,12,90,44,32)
1 for j←2 to 11
2 do keyA[2] =83
3 ›добавить A[2] к отсортированной части A[1] = 56
4 i←j-1 = 1
5 while 1 > 0 and A[1] = 56 не > key = 83
8 A[1+1]=key=83  А = (56, 83, 55…...)

1 for j←3 to 11
2 do keyA[3] =55
3 ›добавить A[3] к отсортированной части A[1,2] = (56, 83)
4 i←j-1 = 2
5 while 2 > 0 and A[2] = 83 > key = 55
6 A[3]← A[2]=83
7 i ←i - 1 = 1
5 while 1 > 0 and A[1] = 56 > key = 55
6 A[2]← A[1]=56
7 i ←i - 1 = 0
А = (55, 56, 83,9…...)
8 A[1] ←key = 55

1 for j←4 to 11
2 do keyA[4] =9
3 ›добавить A[4] к отсортированной части A[1,2,3] = (55, 56, 83)
4 i←j-1 = 3
5 while 3 > 0 and A[3] = 83 > key = 9
6 A[4]← A[3]=83
7 i ←i - 1 = 2
5 while 2 > 0 and A[2] = 56 > key = 9
6 A[3]← A[2]=56
7 i ←i - 1 = 1
5 while 1 > 0 and A[1] = 55 > key = 9
6 A[2]← A[1]=55
7 i ←i - 1 = 0

8 A[1] ←key = 9 А = (9,55, 56, 83….)

1 for j←5 to 11
2 do keyA[5] =55
3 ›добавить A[5] к отсортированной части A[1,2,3,4] = (9,55, 56, 83)
4 i←j-1 = 4
5 while 4 > 0 and A[4] = 83 > key = 55
6 A[5]← A[4]=83
7 i ←i - 1 = 3
5 while 3 > 0 and A[3] = 56 > key = 55
6 A[4]← A[3]=56
7 i ←i - 1 = 2
5 while 2 > 0 and A[2] = 55 не > key = 55
8 A[3] ←key = 55 А = (9,55,55, 56, 83….)

1 for j←6 to 11
2 do keyA[6] =1
3 ›добавить A[6] к отсортированной части A[1,2,3,4,5] = (9,55,55, 56, 83)
4 i←j-1 = 5
5 while 5 > 0 and A[5] = 83 > key = 1
6 A[6]← A[5]=83
7 i ←i - 1 = 4
5 while 4 > 0 and A[4] = 56 > key = 1
6 A[5]← A[4]=56
7 i ←i - 1 = 3
5 while 3 > 0 and A[3] = 55 > key = 1
6 A[4]← A[3]=55
7 i ←i - 1 = 2
5 while 2 > 0 and A[2] = 55 > key = 1
6 A[3]← A[2]=55
7 i ←i - 1 = 1
5 while 1 > 0 and A[1] = 9 > key = 1
6 A[2]← A[1]=9
7 i ←i - 1 = 0

8 A[1] ←key = 1

1 for j←7 to 11
2 do keyA[7] =10
3 ›добавить A[7] к отсортированной части A[1,2,3,4,5,6] = (1,9,55,55, 56,
83)
4 i←j-1 = 6
5 while 6 > 0 and A[6] = 83 > key = 10
6 A[7]← A[6]=83
7 i ←i - 1 = 5
5 while 5 > 0 and A[5] = 56 > key = 10
6 A[6]← A[5]=56
7 i ←i - 1 = 4
5 while 4 > 0 and A[4] = 55 > key = 10
6 A[5]← A[4]=55
7 i ←i - 1 = 3
5 while 3 > 0 and A[3] = 55 > key = 10
6 A[4]← A[3]=55
7 i ←i - 1 = 2
5 while 2 > 0 and A[2] = 9 не> key = 10
8 A[3] ←key = 10

1 for j←8 to 11
2 do keyA[8] =12
3 ›добавить A[8] к отсортированной части
A[1,2,3,4,5,6,7] = (1,9,10,55,55, 56, 83)
4 i←j-1 = 7
5 while 7 > 0 and A[7] = 83 > key = 12
6 A[8]← A[7]=83
7 i ←i - 1 = 6
5 while 6 > 0 and A[6] = 56 > key = 12
6 A[7]← A[6]=56
7 i ←i - 1 = 5
5 while 5 > 0 and A[5] = 55 > key = 12
6 A[6]← A[5]=55
7 i ←i - 1 = 4
5 while 4 > 0 and A[4] = 55 > key = 12
6 A[5]← A[4]=55
7 i ←i - 1 = 3
5 while 3 > 0 and A[3] = 10 не > key = 12
8 A[4] ←key = 12

1 for j←9 to 11
2 do keyA[9] =90
3 ›добавить A[8] к отсортированной части
A[1,2,3,4,5,6,7,8] = (1,9,10,12,55,55, 56, 83)
4 i←j-1 = 8
5 while 8 > 0 and A[8] = 83 > key = 90
8 A[9] ←key = 90

1 for j←10 to 11
2 do keyA[10] =44
3 ›добавить A[10] к отсортированной части
A[1,2,3,4,5,6,7,8.9] = (1,9,10,12,55,55, 56, 83,90)
4 i←j-1 = 9
5 while 9 > 0 and A[9] = 90 > key = 44
6 A[10]← A[9]=90
7 i ←i - 1 = 8
5 while 8 > 0 and A[8] = 83 > key = 44
6 A[9]← A[8]=83
7 i ←i - 1 = 7
5 while 7 > 0 and A[7] = 56 > key = 44
6 A[8]← A[7]=56
7 i ←i - 1 = 6
5 while 6 > 0 and A[6] = 55 > key = 44
6 A[7]← A[6]=55
7 i ←i - 1 = 5
5 while 5 > 0 and A[5] = 55 > key = 44
6 A[6]← A[5]=55
7 i ←i - 1 = 4
5 while 4 > 0 and A[4] = 12 не > key = 44
8 A[5] ←key = 44

1 for j←11 to 11
2 do keyA[11] =32
3 ›добавить A[11] к отсортированной части
A[1,2,3,4,5,6,7,8,9,10] = (1,9,10,12,44,55,55, 56, 83,90)
4 i←j-1 = 10
5 while 10 > 0 and A[10] = 90 > key = 32
6 A[11]← A[10]=90
7 i ←i - 1 = 9
5 while 9 > 0 and A[9] = 83 > key = 32
6 A[10]← A[9]=83
7 i ←i - 1 = 8
5 while 8 > 0 and A[8] = 56 > key = 32
6 A[9]← A[8]=56
7 i ←i - 1 = 7
5 while 7 > 0 and A[7] = 55 > key = 32
6 A[8]← A[7]=55
7 i ←i - 1 = 6
5 while 6 > 0 and A[6] = 55 > key =32
6 A[7]← A[6]=55
7 i ←i - 1 = 5
5 while 5 > 0 and A[5] = 44 > key = 32
6 A[6]← A[5]=55
7 i ←i - 1 = 4
5 while 4 > 0 and A[4] = 12 не > key = 32
8 A[5] ←key = 32 A= (1,9,10,12,32,44,55,55, 56, 83,90)
Псевдокод MergeSort
1 MergeSort(A, p, r):
2 if p < r:
3 q ← [(p + r) // 2]
4 MergeSort(A, p, q)
5 MergeSort(A, q + 1, r)
6 Merge(A, p, q, r)

Merge(A, p, q, r):
7 n1 ← q - p + 1
8 n2 ← r - q
9 left ← new array of size n1
10 right ← new array of size n2

11 for i ← 0 to n1 - 1:
12 left[i] ← A[p + i]
13 for j ← 0 to n2 - 1:
14 right[ j] ← A[q + j + 1]

15 i ← 0
16 j ← 0
17 k ← p

18 while i < n1 and j < n2:


19 if left[i] ≤ right[ j]:
20 A[k] ← left[i]
21 i ← i + 1
else:
22 A[k] ← right[ j]
23 j ← j + 1
24 k ← k + 1

25 while i < n1:


26 A[k] ← left[i]
27 i ← i + 1
28 k ← k + 1

29 while j < n2:


30 A[k] ← right[ j]
31 j ← j + 1
32 k ← k + 1

Трассировка:
Исходный массив: A = [56, 83, 55, 9, 55, 1, 10, 12, 90, 44, 32]

1 MergeSort(A, 0, 10)
2 if(0<10)
3 q = (0 + 10) / 2 = 5.
4 Вызов MergeSort(A, 0, 5)
2 if(0<5)
3 q = [(0 + 5) / 2 ]= 2.
4 Вызов MergeSort(A, 0, 2)
2 if(0<2)
3 q = (0 + 2) / 2 = 1.
4 Вызов MergeSort(A, 0, 1)
2 if(0<1)
3 q = (0 + 1) / 2 = 0.
4 Вызов MergeSort(A, 0, 0)
2 if(0<0) False
5 Вызов MergeSort(A, 1, 1)
2 if(1<1) Здесь p = 1 и r = 1, так что условие if не выполняется.
6 merge(A, 0, 0,1) p=0 q=0 r=1
7 n1 =0-0+1=1
8 n2 =1-0=1
9 left ← new array of size n1
10 right ← new array of size n2
11 for i ← 0 to n1 - 1:
12 left[0] ← A[0]=56
13 for j ← 0 to n2 - 1:
14 right[0] ← A[1]=83
15 i ← 0
16 j ← 0
17 k ← p
18 while i < n1 and j < n2: n1=1 n2=1
19 if left[0]=56 ≤ right[0]=83:
20 A[k] ← left[0] k=0
21 i ← i + 1 i=1
24 k ← k + 1 k=1
25 while i < n1:(False)
29 while j < n2: j=0 n2=1
30 A[1] ← right[0]
31 j ← j + 1
32 k ← k + 1
6 merge(A, 0, 1, 2):
7 n1 =2
8 n2 =1
9 left ← new array of size n1
10 right ← new array of size n2

11 for i ← 0 to n1 - 1:
12 left[0] ← A[0]=56
left[1] ← A[1]=83
13 for j ← 0 to n2 - 1:
14 right[0] ← A[2]=55
15 i ← 0
16 j ← 0
17 k ← p

18 while i < n1 and j < n2: n1=2 n2=1


19 if left[0]=56 ≤ right[0]=55:False
22 A[0] ← right[0]=55
23 j ← j + 1
24 k ← k + 1
18 while i < n1 and j < n2: False n1=2 n2=1

25 while i < n1:


26 A[1] ← left[0]=56
27 i ← i + 1
28 k ← k + 1
25 while i < n1:
26 A[2] ← left[1]=83
27 i ← i + 1
28 k ← k + 1
25 while i < n1: False
29 while j < n2:False
5 MergeSort(A,2+1, 5)
1 MergeSort(A,3, 5)
2 if 3 < 5:
3 q ← (p + r) // 2=4
4 MergeSort(A,3, 4)
1 MergeSort(A,3, 4)
2 if 3 < 4:
3 q ← (p + r) / 2=3
4 MergeSort(A,3, 3)
1 MergeSort(A,3, 3)
2 if 3 <3: False
5 MergeSort(A,3+1, 4)
2 if 4 < 4:False

6 merge(A, 3, 3, 4):
7 n1 =1
n2 =1
9 left ← new array of size n1
10 right ← new array of size n2

11 for i ← 0 to n1 - 1:
12 left[0] ← A[3]=9
13 for j ← 0 to n2 - 1:
14 right[0] ← A[4]=55
15 i ← 0
16 j ← 0
17 k ← p

18 while i < n1 and j < n2: n1=1 n2=1


19 if left[0]=9 ≤ right[0]=55
20 A[3] = left[0]
21 i ← i + 1
22 k ← k + 1
18 while i < n1 and j < n2: False n1=1 n2=1

25 while i < n1: False


29 while j < n2:
30 A[4] ← right[0]=55
31 j ← j + 1
32 k ← k + 1
29 while j < n2:False И т.д

Массив на данный момент

Псевдокод для ShellSort


1 shellSort(arr):
2 gap ← [длина(A) // 2]=5
3 while 5 > 0 do
4 for i ← gap to длина(A) do i=5
5 key ← A[5]=1
6 j←i j=5 i=5
7 while j >= 5 and arr[0] > 1
8 arr[5] = arr[0]
9 j ← j - gap=0
7 while j >= 5 and arr[-5] > 1 False
10 A[0] ← key=1
4 for i ← gap to длина(A) do i=6
5 key ← A[6]=10
6 j←i j=6 i=6
7 while j >= 5 and arr[1] > 10
9 j ← j - gap=1
7 while j >= 5 and arr[-4] > 10 False
10 A[1] ← key=10

4 for i ← gap to длина(A) do i=7


5 key ← A[7]=12
6 j←i j=7 i=7
7 while j >= 5 and arr[2] > 12
8 arr[7] = arr[2]
9 j ← j - gap=2
7 while j >= 5 and arr[-3] > 10 False
10 A[2] ← key=12

4 for i ← gap to длина(A) do i=8


5 key ← A[8]=90
6 j←i j=8 i=8
7 while j >= 5 and arr[3] > 90 False
10 A[8] ← key=90

4 for i ← gap to длина(A) do i=9


5 key ← A[8]=44
6 j←i j=9 i=9
7 while j >= 5 and arr[4] > 44
8 arr[9] = arr[4]
9 j ← j - gap=4
7 while j >= 5 and arr[-1] > 44 False
10 A[4] ← key=44

4 for i ← gap to длина(A) do i=10


5 key ← A[10]=32
6 j←i j=10 i=10
7 while j >= 5 and arr[5] > 32
8 arr[10] = arr[5]=56
9 j ← j - gap=5
7 while j >= 5 and arr[0] > 32 False
10 A[5] ← key=32

11 gap ← [ gap // 2 ]=2


3 while 2 > 0 do
4 for i ← gap to длина(A) do i=2
5 key ← A[2]=12
6 j←i j=2 i=2
7 while j >= 2 and arr[0] > 12 False
10 A[2] ← key=12
4 for i ← gap to длина(A) do i=3
5 key ← A[3]=9
6 j←i j=3 i=3
7 while j >= 3 and arr[1] > 9
8 arr[3] = arr[1]=10
9 j ← j - gap=1
7 while j >= 2 and arr[-1] > 9 False
10 A[1] ← key= 9

4 for i ← gap to длина(A) do i=7


5 key ← A[7]=12
6 j←i j=7 i=7
7 while j >= 5 and arr[2] > 12
8 arr[7] = arr[2]
9 j ← j - gap=2
7 while j >= 5 and arr[-3] > 10 False
10 A[2] ← key=12

4 for i ← gap to длина(A) do i=8


5 key ← A[8]=90
6 j←i j=8 i=8
7 while j >= 5 and arr[3] > 90 False
10 A[8] ← key=90

4 for i ← gap to длина(A) do i=9


5 key ← A[8]=44
6 j←i j=9 i=9
7 while j >= 5 and arr[4] > 44
8 arr[9] = arr[4]
9 j ← j - gap=4
7 while j >= 5 and arr[-1] > 44 False
10 A[4] ← key=44

4 for i ← gap to длина(A) do i=10


5 key ← A[10]=32
6 j←i j=10 i=10
7 while j >= 5 and arr[5] > 32
8 arr[10] = arr[5]=56
9 j ← j - gap=5
7 while j >= 5 and arr[0] > 32 False
10 A[5] ← key=32

И т.д
Массив на данный момент :

Финальный результат :
Что совпадает с теоретическими данными.
Shellsort =log n исходя из наблюдений

Исходный код :
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>

using namespace std;


using namespace std::chrono;

// Функция для сортировки вставкой


void insertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while ( j >= 0 && arr[ j] > key) {
arr[ j + 1] = arr[ j];
j--;
}
arr[ j + 1] = key;
}
}

// Функция для сортировки слиянием


void merge(vector<int>& arr, int l, int m, int r) {
int n1 = m - l + 1;
int n2 = r - m;

vector<int> L(n1), R(n2);

for (int i = 0; i < n1; i++)


L[i] = arr[l + i];
for (int i = 0; i < n2; i++)
R[i] = arr[m + 1 + i];

int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[ j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[ j];
j++;
}
k++;
}

while (i < n1) {


arr[k] = L[i];
i++;
k++;
}

while ( j < n2) {


arr[k] = R[ j];
j++;
k++;
}
}

void mergeSort(vector<int>& arr, int l, int r) {


if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}

// Функция для сортировки Шелла


void shellSort(vector<int>& arr) {
int n = arr.size();
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int key = arr[i];
int j = i;
while ( j >= gap && arr[ j - gap] > key) {
arr[ j] = arr[ j - gap];
j -= gap;
}
arr[ j] = key;
}
}
}

int main() {
vector<int> A = {56, 83, 55, 9, 55, 1, 10, 12, 90, 44, 32};
vector<int> B = A; // Копия для каждого алгоритма

// Измерение времени для сортировки вставкой


auto start = high_resolution_clock::now();
insertionSort(B);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << "Отсортированный массив (Insertion sort): ";
for (int num : B) {
cout << num << " ";
}
cout << "\nВремя выполнения (Insertion sort): " << duration.count() << "
микросекунд." << endl;
B = A; // Восстанавливаем копию массива

// Измерение времени для сортировки слиянием


start = high_resolution_clock::now();
mergeSort(B, 0, B.size() - 1);
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop - start);
cout << "Отсортированный массив (Merge sort): ";
for (int num : B) {
cout << num << " ";
}
cout << "\nВремя выполнения (Merge sort): " << duration.count() << "
микросекунд." << endl;

B = A; // Восстанавливаем копию массива

// Измерение времени для сортировки Шелла


start = high_resolution_clock::now();
shellSort(B);
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop - start);
cout << "Отсортированный массив (Shellsort): ";
for (int num : B) {
cout << num << " ";
}
cout << "\nВремя выполнения (Shellsort): " << duration.count() << "
микросекунд." << endl;

return 0;
}

Исходный код программы :


#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>

using namespace std;


using namespace std::chrono;

// Функция для сортировки вставкой


void insertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while ( j >= 0 && arr[ j] > key) {
arr[ j + 1] = arr[ j];
j--;
}
arr[ j + 1] = key;
}
}

// Функция для сортировки слиянием


void merge(vector<int>& arr, int l, int m, int r) {
int n1 = m - l + 1;
int n2 = r - m;

vector<int> L(n1), R(n2);

for (int i = 0; i < n1; i++)


L[i] = arr[l + i];
for (int i = 0; i < n2; i++)
R[i] = arr[m + 1 + i];

int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[ j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[ j];
j++;
}
k++;
}

while (i < n1) {


arr[k] = L[i];
i++;
k++;
}

while ( j < n2) {


arr[k] = R[ j];
j++;
k++;
}
}

void mergeSort(vector<int>& arr, int l, int r) {


if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
// Функция для сортировки Шелла
void shellSort(vector<int>& arr) {
int n = arr.size();
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int key = arr[i];
int j = i;
while ( j >= gap && arr[ j - gap] > key) {
arr[ j] = arr[ j - gap];
j -= gap;
}
arr[ j] = key;
}
}
}

int main() {
vector<int> sizes = {5000, 16000, 246000};

for (int size : sizes) {


vector<int> arr(size);

// Заполнение массива случайными числами


for (int i = 0; i < size; i++) {
arr[i] = rand();
}

vector<int> arrCopy = arr; // Копия массива для каждого алгоритма

// Измерение времени для сортировки вставкой


auto start = high_resolution_clock::now();
insertionSort(arrCopy);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << "Insertion sort для " << size << " элементов: " << duration.count()
<< " микросекунд." << endl;

arrCopy = arr; // Восстанавливаем копию массива

// Измерение времени для сортировки слиянием


start = high_resolution_clock::now();
mergeSort(arrCopy, 0, size - 1);
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop - start);
cout << "Merge sort для " << size << " элементов: " << duration.count()
<< " микросекунд." << endl;

arrCopy = arr; // Восстанавливаем копию массива

// Измерение времени для сортировки Шелла


start = high_resolution_clock::now();
shellSort(arrCopy);
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop - start);
cout << "Shell sort для " << size << " элементов: " << duration.count() << "
микросекунд." << endl;
}

return 0;
}

Вам также может понравиться