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

МИНОБРНАУКИ РОССИИ

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра информационной безопасности

ОТЧЕТ
по лабораторной работе №1
по дисциплине «Алгоритмы и структуры данных»
Тема: Алгоритмы сортировки массивов

Студент гр. 1363 Дао Н. Х.

Преподаватель Беляев А. В.

Санкт-Петербург
2022
Цель работы
Ознакомление с алгоритмами сортировки линейных структур и оценкой
эффективности данных алгоритмов.
Теоретические сведения
Упорядочение элементов множества в возрастающем или убывающем
порядке называется сортировкой. Сортировка применяется при трансляции
программ, при организации наборов данных на внешних носителях, при
создании библиотек, каталогов, баз данных и т.д.
1. Сортировка выбором.
Сортировка выбором состоит в том, что сначала в неупорядоченном
списке выбирается и отделяется от остальных наименьший элемент. C этого
этапа начинает формироваться упорядоченная часть списка. На каждом этапе
из неотсортированной (остающейся) части извлекается наименьший элемент и
присоединяется (справа) к отсортированной части, наращивая ее. Процесс
продолжается до тех пор, пока все элементы не будут перенесены в
отсортированную часть списка.
Алгоритм:
 Находится наименьший элемент в массиве;
 Найденный элемент меняется с первым элементом;
 Процесс повторяется с оставшимися n-1 элементами, n-2
элементами и так далее, пока в конце не останется самый большой элемент,
который не нуждается в перестановке.
Сложность метода сортировки выбором O(n2) операций.
2. Быстрая сортировка (сортировка Т.Хоара).
В методе быстрой сортировки из массива выбирается какой-либо элемент
(базовый элемент, также – база, ключевой элемент), относительно значения
которого весь массив будет разделен на две непересекающиеся части:
 в левой будут располагаться элементы со значениями меньшими
либо равными базовому;

2
 в правой части – элементы со значениями большими либо равными
базовому.
Такое разделение позволит далее запустить алгоритм рекурсивно, по
результату чего весь исходный массив окажется отсортированным.
Алгоритм реализуется посредством ввода двух индексов:
 первый первоначально указывает на самый левый элемент
разделяемого массива и будет постепенно смещаться вправо;
 второй первоначально указывает на самый правый элемент
разделяемого массива и будет постепенно смещаться влево.
В случае нахождения в процессе смещения индексов пары элементов,
расположенных в определенном смысле «некорректно» относительно базового
элемента (левый индекс указывает на элемент больший либо равный базовому,
а правый индекс указывает на элемент меньший либо равный базовому),
данные два элемента должны быть разменяны местами.
Разделение массива прекращается, если первый индекс оказывается
строго правее второго.
Средняя сложность метода Хоара O(n×log2n), в худшем случае – O(n2).
3. Сортировка подсчетом.
Сортировка подсчётом — алгоритм сортировки целых чисел в диапазоне
от 0 до некоторой константы. Пусть в сортируемом массиве размещены целые
числа из небольшого (до 10.000) диапазона значений. Введем вспомогательный
одномерный массив длины равной диапазону значений и инициализируем его
нулями. Первым проходом сортируемого массива подсчитаем кол-во элементов
с каждым конкретным значений (храня счетчики во вспомогательном массиве),
вторым проходом по вспомогательному массиву слева направо восстановим
исходный массив сразу в отсортированном виде.
Метод имеет оценку сложности O(n), где n – большее из 2 чисел: длина
массива либо диапазон допустимых значений его элементов.

3
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Провести сортировку массива тремя методами выбором, быстрой
сортировкой и подсчётом.
Вариант 7. {11, 3, 12, 15, 14, 14, 12, 6, 7, 11, 15, 10, 3, 9, 3}
1. Сортировка выбором

11 3 12 15 14 14 12 6 7 11 15 10 3 9 3
3 11 12 15 14 14 12 6 7 11 15 10 3 9 3
3 11 12 15 14 14 12 6 7 11 15 10 3 9 3
3 3 12 15 14 14 12 6 7 11 15 10 11 9 3
3 3 12 15 14 14 12 6 7 11 15 10 11 9 3
3 3 3 15 14 14 12 6 7 11 15 10 11 9 12
3 3 3 15 14 14 12 6 7 11 15 10 11 9 12
3 3 3 6 14 14 12 15 7 11 15 10 11 9 12
3 3 3 6 14 14 12 15 7 11 15 10 11 9 12
3 3 3 6 7 14 12 15 14 11 15 10 11 9 12
3 3 3 6 7 14 12 15 14 11 15 10 11 9 12
3 3 3 6 7 9 12 15 14 11 15 10 11 14 12
3 3 3 6 7 9 12 15 14 11 15 10 11 14 12
3 3 3 6 7 9 10 15 14 11 15 12 11 14 12
3 3 3 6 7 9 10 15 14 11 15 12 11 14 12
3 3 3 6 7 9 10 11 14 15 15 12 11 14 12
3 3 3 6 7 9 10 11 14 15 15 12 11 14 12
3 3 3 6 7 9 10 11 11 15 15 12 14 14 12
3 3 3 6 7 9 10 11 11 15 15 12 14 14 12
3 3 3 6 7 9 10 11 11 12 15 15 14 14 12
3 3 3 6 7 9 10 11 11 12 15 15 14 14 12
3 3 3 6 7 9 10 11 11 12 12 15 14 14 15
3 3 3 6 7 9 10 11 11 12 12 15 14 14 15
3 3 3 6 7 9 10 11 11 12 12 14 15 14 15
3 3 3 6 7 9 10 11 11 12 12 14 15 14 15
3 3 3 6 7 9 10 11 11 12 12 14 14 15 15
Табл.1. Сортировка выбором

2. Быстрая сортировка

1. 11 3 12 15 14 14 12 6 7 11 15 10 3 9 3
2. i j
3. 11 3 12 15 14 14 12 6 7 11 15 10 3 9 3
4. 3 3 12 15 14 14 12 6 7 11 15 10 3 9 11
5. i j
6. i j
7. 3 3 12 15 14 14 12 6 7 11 15 10 3 9 11
8. 3 3 3 15 14 14 12 6 7 11 15 10 12 9 11
9. i j

4
10. i j
11. i j
12. i j
13. i j
14. 3 3 3 15 14 14 12 6 7 11 15 10 12 9 11
15. 3 3 3 6 14 14 12 15 7 11 15 10 12 9 11
16. i j
17. i j
18. i,j
19. j i
20. 3 3 3 6 14 14 12 15 7 11 15 10 12 9 11
21. i j
22. i j
23. i j
24. i j
25. i j
26. i j
27. i j
28. 3 3 3 6 14 14 12 15 7 11 15 10 12 9 11
29. 3 3 3 6 7 14 12 15 14 11 15 10 12 9 11
30. i j
31. i j
32. i,j
33. j i
34. 3 3 3 6 7 14 12 15 14 11 15 10 12 9 11
35. i j
36. i j
37. 3 3 3 6 7 14 12 15 14 11 15 10 12 9 11
38. 3 3 3 6 7 9 12 15 14 11 15 10 12 14 11
39. i j
40. i j
41. 3 3 3 6 7 9 12 15 14 11 15 10 12 14 11
42. 3 3 3 6 7 9 10 15 14 11 15 12 12 14 11
43. i j
44. i j
45. i j
46. i,j
47. j i
48. 3 3 3 6 7 9 10 15 14 11 15 12 12 14 11
49. i j
50. 3 3 3 6 7 9 10 15 14 11 15 12 12 14 11
51. 3 3 3 6 7 9 10 11 14 11 15 12 12 14 15
52. i j

5
53. i j
54. i j
55. i j
56. i j
57. 3 3 3 6 7 9 10 11 14 11 15 12 12 14 15
58. 3 3 3 6 7 9 10 11 11 14 15 12 12 14 15
59. j i
60. 3 3 3 6 7 9 10 11 11 14 15 12 12 14 15
61. i j
62. i j
63. i j
64. 3 3 3 6 7 9 10 11 11 14 15 12 12 14 15
65. 3 3 3 6 7 9 10 11 11 12 15 12 14 14 15
66. i j
67. 3 3 3 6 7 9 10 11 11 12 15 12 14 14 15
68. 3 3 3 6 7 9 10 11 11 12 12 15 14 14 15
69. j i
70. 3 3 3 6 7 9 10 11 11 12 12 15 14 14 15
71. i j
72. i j
73. 3 3 3 6 7 9 10 11 11 12 12 15 14 14 15
74. 3 3 3 6 7 9 10 11 11 12 12 14 14 15 15
75. i,j
76. j i
77. 3 3 3 6 7 9 10 11 11 12 12 14 14 15 15
Табл.2. Быстрая сортировка

3. Сортировка подсчётом
{11, 3, 12, 15, 14, 14, 12, 6, 7, 11, 15, 10, 3, 9, 3}

Значение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Счетчик 0 0 3 0 0 1 1 0 1 1 2 2 0 2 2

Отсортированный массив
{3, 3, 3, 6, 7, 9, 10, 11, 11, 12, 12, 14, 14, 15, 15}

6
ПРАКТИЧЕСКАЯ ЧАСТЬ
Разработка программу для сортировки массив длины L = 15000
выбором, подсчетом и отображение времени исполнения в миллисекундах.
Сортировки выбором.

Рис. 1 – Сортировка выбором с длиной L = 15000

Метод Выбором
Длина массива L 2L 3L 6L
Время t, мс 658 2672 5915 21530
Табл.3. Время сортировки выбором

Рис. 2 – График зависимости времени сортировки от количества элементов


сортируемого массива выбором
7
Сортировки подсчётом.

Рис. 3 – Сортировка подсчётом с длиной L = 15000

Метод Подсчётом
Длина массива L 2L 3L 6L
Время t, мкс 997 1000 1015 1028
Табл.4. Время сортировки подсчётом

Рис. 4 – График зависимости времени сортировки от количества элементов


сортируемого массива подсчётом

8
Исходный код
Сортировка выбором.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

void SelectionSort(int arr[], int n)


{
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
if (arr[i] > arr[j])
{
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int n;
scanf("%d", &n); //n – количество элементов массива
int arr[n];
struct timeval t1, t2;
double t;
srand(time(NULL));
for (int i = 0; i < n; i++)
{
arr[i] = rand() % 50000;
}
printf("First 10:\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\nLast 10:\n");
for (int i = n - 10; i < n; i++)
{
printf("%d ", arr[i]);
}
gettimeofday(&t1, NULL);
SelectionSort(arr, n);
gettimeofday(&t2, NULL);
printf("\nFirst 10:\n");
for (int i = 0; i < 10; i++)
{
9
printf("%d ", arr[i]);
}
printf("\nLast 10:\n");
for (int i = n - 10; i < n; i++)
{
printf("%d ", arr[i]);
}
t = ((t2.tv_sec * 1000000 + t2.tv_usec) - (t1.tv_sec *
1000000 + t1.tv_usec)) / 1000;
printf("\nTime: %g ms\n", t);
return 0;
}

Сортировка подсчётом.

void CountingSort(int arr[], int n)


{
int count[50000] = {0};
int k = 0;
for (int i = 0; i < n; i++)
{
count[arr[i]] = count[arr[i]] + 1;
}
for (int i = 0; i < 50000; i++)
{
for (int j = 0; j < count[i]; j++)
{
arr[k] = i;
k++;
}
}
}

Выводы
После выполнения сортировки массива разными методами мы
замечаем, что у каждого метода разное время выполнения, и зависимость
времени от количества элементов массива, чем больше элементов в массиве,
тем больше времени требуется на сортировку. По графику видно, что метод
подсчёта намного эффективнее метода выбора.

10

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