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

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

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

ОТЧЁТ
по практической работе №3 на тему:
«Сортировка числовых массивов. Некоторые методы сортировки.»
по дисциплине «Алгоритмы и структуры данных»

Выполнили: студентки группы ИСТ-032, Алексеева М. О.,


Эверстова В. И.
Принял: Медведев С. А.

Санкт-Петербург
2021
Задание
Требуется считать из файла, находящегося на диске одномерный массив,
состоящий из 30 произвольных целых чисел и отсортировать его в порядке убывания
помощью сортировки подсчетом. На экран вывести количество операций сравнения и
пересылки чисел и время выполнения программы для каждого метода.
Ход решения.

Сортировка подсчетом применяется для массива A дискретных данных (например,


целых чисел, символов), которые принимают значения из небольшого диапазона. Идея
сортировки состоит в том, чтобы просто посчитать, сколько раз каждое число из
диапазона 0..n встречается в массиве, и вставить его в нужное место вспомогательного
массива. Числа могут не встречаться вообще, встречаться 1 раз, или встречаться несколько
раз. Чтобы заполнить вспомогательный массив, нужно пройти по массиву чисел один раз,
и он будет считать сколько раз то или иное число встретилось в заданном массиве. Чтобы
получить окончательный отсортированный массив, нужно теперь пройти по массиву
счётчиков и последовательно, друг за другом переписать все числа в нужных количествах
в сортируемый массив. Таким образом, каждый непустой счётчик просто дописывает в
массив свою позицию столько раз, сколько он насчитал.

Рассмотрим отрывок кода:

1. int maxn = 0;
2. for (int i = 0; i < n; i++) {
3. if (arr[i] > maxn){
4. maxn = arr[i];
5. }
6. }
7. int minn;
8. minn = maxn;
9.
10. for (int i = 0; i < n; i++) {
11. if (arr[i] < minn){
12. minn = arr[i];
13. }
14. }
15. int *sarr = new int [maxn - minn];
16. for (int i = minn; i <= maxn; i++) {
17. sarr[i] = 0;
18. }
19.
20. for (int i = 0; i < n; i++) {
21. sarr[arr[i] - minn]++;
22. }
23.
24. int l=0;
25. for (int i=minn;i <= maxn;++i){
26. for (int j=1;j <= sarr[i];++j){
27. arr[l] = i + minn;
28. l++;
29. }…………

Для того, чтобы посчитать сколько раз встречается каждый элемент массива arr,
был создан вспомогательный массив sarr (стр. 15), который предварительно заполнили
нулями (стр. 16, 17). Затем был просмотрен массив arr, увеличивая при этом для каждого
его элемента счетчик массива sarr (стр. 20, 21). Наконец, был просмотрен и
дополнительный массив sarr, при этом для каждого его i-того элемента выводится
зачение i столько раз, сколько он встретился в исходном массиве (стр. 25, 26, 27). В итоге,
для сортировки потребуется k раз пройтись по массиву-счетчику sarr и n раз по
заданному массиву arr. Таким образом, сложность алгоритма сортировки методом
подсчета будет составлять О(n+k), где n – это количество элементов, а k – максимальное
значение элемента в заданном массиве.

Исходя из сложности алгоритма можно понять, что применение алгоритма


сортировки целесообразно лишь тогда, когда мы сортируем большое количество чисел,
значения которых имеют небольшой разброс (диапазон). Так как длина счетного массива
равна разнице между минимальным и максимальным значением исходного массива.
Если этот дипазон будет слишком большим, то и массив-счетчик будет очень массивным,
как и его вычислительная сложность. Потому что вычислительная сложность по памяти
будет составлять O(k). К тому же, этим методом сортировки можно обработать только
целые числа.
Вывод.
В ходе выполнения задания были приобретены навыки и умения анализа
алгоритма и всего кода разработанной программы сортировки в Big-O-нотации.
Листинг 1.

#include <iostream>
#include <stdlib.h>
#include <Windows.h>
#include <string>
#include <fstream>

using namespace std;

void sortirovka(int *arr, int n)


{
int maxn = 0;
for (int i = 0; i < n; i++) {
if (arr[i] > maxn){
maxn = arr[i];
}
}
int minn;
minn = maxn;

for (int i = 0; i < n; i++) {


if (arr[i] < minn){
minn = arr[i];
}
}
int *sarr = new int [maxn - minn];
for (int i = minn; i <= maxn; i++) {
sarr[i] = 0;
}

for (int i = 0; i < n; i++) {


sarr[arr[i] - minn]++;
}

int l=0;
for (int i=minn;i <= maxn;++i){
for (int j=1;j <= sarr[i];++j){
arr[l] = i + minn;
l++;
}
}
}

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int n = 0;
int *arr;
string line;

fstream ffile("massiv.txt");
while (!ffile.eof()){
while (getline(ffile,line))
{
n++;
}
}
ffile.close();

arr = new int[n];

fstream File("massiv.txt");

while (!File.eof()){
for (int i=0; i<n; i++){
File>>arr[i];
}
}

cout << "\n\nмассив из файла: \n";


for (int i = 0; i < n; i++) {
cout << arr[i] << "\t";
}

sortirovka(arr, n);

cout << "\n\nотсортированный массив: \n";


for (int i = 0; i < n; i++) {
cout << arr[i] << "\t";
}
File.close();
delete arr;
return 0;
}

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