Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ.
ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Кафедра безопасности информационных систем
ОТЧЁТ
по практической работе №3 на тему:
«Сортировка числовых массивов. Некоторые методы сортировки.»
по дисциплине «Алгоритмы и структуры данных»
Санкт-Петербург
2021
Задание
Требуется считать из файла, находящегося на диске одномерный массив,
состоящий из 30 произвольных целых чисел и отсортировать его в порядке убывания
помощью сортировки подсчетом. На экран вывести количество операций сравнения и
пересылки чисел и время выполнения программы для каждого метода.
Ход решения.
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 – максимальное
значение элемента в заданном массиве.
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
#include <string>
#include <fstream>
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();
fstream File("massiv.txt");
while (!File.eof()){
for (int i=0; i<n; i++){
File>>arr[i];
}
}
sortirovka(arr, n);