Структуры и алгоритмы обработки данных. Сортировка массивов и динамические структуры (90
.pdfМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра информатики
СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ СОРТИРОВКА МАССИВОВ И ДИНАМИЧЕСКИЕ СТРУКТУРЫ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ для студентов
к лабораторным работам по курсу
«Структуры и алгоритмы обработки данных»
Р.В. Батищев
Липецк Липецкий государственный технический университет
2016
3
УДК 004.451(07)
Б282
Рецензент: О.А. Назаркин, доц. кафедры АСУ, канд. техн. наук.
Батищев, Р.В.
Б282 Структуры и алгоритмы обработки данных. Сор-
тировка массивов и динамические структуры [Текст]:
метод. указ. к лабораторным работам по курсу «Струк-
туры и алгоритмы обработки данных» / Р.В. Батищев. –
Липецк: Изд-во Липецкого государственного техниче-
ского университета, 2016. – 32 с.
Методические указания предназначены для студентов направления подготовки бакалавров 27.03.04.
Рассмотрены некоторые алгоритмы сортировки, принципы организа-
ции основных динамических структур: односвязные и двусвязные спи-
ски, двоичные упорядоченные деревья. Приведены примеры их реали-
зации на языке Си и задания к лабораторным работам.
Табл. 3. Рис. 5. Библиогр.: 5 назв.
ФГБОУ ВО «Липецкий государственный технический университет», 2016
4
3175
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра информатики
СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ. СОРТИРОВКА МАССИВОВ И ДИНАМИЧЕСКИЕ СТРУКТУРЫ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ для студентов
к лабораторным работам по курсу
«Структуры и алгоритмы обработки данных»
Р.В. Батищев
Липецк Липецкий государственный технический университет
2016
5
Лабораторная работа № 1 Реализация и изучение алгоритмов внутренней сортировки
Цель работы - овладение практическими навыками программирования методов сортировки массивов данных и сравнение эффективности разных по сложности реализации алгоритмов.
Для выполнения лабораторной работы необходимо:
1.Изучить:
-выбранные в соответствии с вариантом задания алгоритмы сортировки;
-критерии оценивания эффективности методов сортировки.
2.Разработать программу, реализующую выбранные алгоритмы сортировки и оценку их эффективности.
3.Подготовить тестовый вариант случайных исходных данных в виде одно-
мерного массива достаточно большого размера и сравнить эффективность реализованных алгоритмов при сортировке этого массива.
4.Сделать выводы по поводу эффективности выбранных алгоритмов сорти-
ровки.
5.Подготовить отчет, содержащий:
-титульный лист;
-задание;
-описание метода решения задачи (с примерами);
-блок-схему алгоритмов;
-текст программы;
-пример выполнения программы;
-выводы по работе;
-список использованной литературы.
6
1.Задание к работе
1.Выбрать из табл. 1 (вариант задается преподавателем) два алгоритма сортировки. Реализовать их на языке программирования высокого уровня. Пре-
дусмотреть в программе возможность сортировки как по возрастанию, так и по убыванию значений, массива заданного размера с пошаговой иллюстрацией ра-
боты алгоритма, а также возможность вычисления и сравнения эффективности работы двух алгоритмов сортировки над одним случайным неупорядоченным массивом данных большого (не менее 1000 элементов) размера. Использовать не менее двух критериев эффективности.
|
|
|
Таблица 1 |
||
|
|
|
|
|
|
Вариант |
Алгоритм сортировки №1 |
Алгоритм сортировки №2 |
|
||
задания |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
|
3 |
|
|
1 |
Сортировка выбором |
Сортировка методом Шелла |
|
||
|
|
|
|
||
2 |
Обменная сортировка |
Сортировка методом Шелла |
|
||
|
|
|
|
||
3 |
Сортировка включением |
Сортировка методом Шелла |
|
||
|
|
|
|
|
|
4 |
Сортировка выбором |
Быстрая сортировка |
|
|
|
|
|
|
|
|
|
5 |
Обменная сортировка |
Быстрая сортировка |
|
|
|
|
|
|
|
|
|
6 |
Сортировка включением |
Быстрая сортировка |
|
|
|
|
|
|
|
|
|
7 |
Сортировка выбором |
Сортировка |
двоичными |
вклю- |
|
чениями |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
8 |
Обменная сортировка |
Сортировка |
двоичными |
вклю- |
|
чениями |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
9 |
Сортировка включением |
Сортировка |
двоичными |
вклю- |
|
чениями |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
10 |
Сортировка выбором |
Сортировка со слиянием |
|
|
|
|
|
|
|
|
|
11 |
Обменная сортировка |
Сортировка со слиянием |
|
|
|
|
|
|
|
|
|
12 |
Сортировка включением |
Сортировка со слиянием |
|
|
|
|
|
|
|
|
|
7
Окончание табл. 1
1 |
2 |
3 |
|
13 |
Сортировка методом Шелла |
Быстрая сортировка |
|
|
|
|
|
14 |
Сортировка методом Шелла |
Сортировка двоичными |
вклю- |
чениями |
|
||
|
|
|
|
|
|
|
|
15 |
Сортировка методом Шелла |
Сортировка со слиянием |
|
|
|
|
|
16 |
Быстрая сортировка |
Сортировка двоичными |
вклю- |
чениями |
|
||
|
|
|
|
|
|
|
|
17 |
Быстрая сортировка |
Сортировка со слиянием |
|
|
|
|
|
18 |
Сортировка двоичными вклю- |
Сортировка со слиянием |
|
чениями |
|
||
|
|
|
|
|
|
|
|
19 |
Сортировка выбором |
Обменная сортировка |
|
|
|
|
|
20 |
Сортировка выбором |
Сортировка включением |
|
|
|
|
|
2.Методический пример выполнения работы
Реализовать алгоритмы сортировки:
1.Обменная сортировка.
2.Быстрая сортировка.
Сравнить эффективность методов сортировки.
Описание алгоритма обменной сортировки
Обменная (пузырьковая сортировка) - один из наиболее широко извест-
ных алгоритмов сортировки. Он состоит из повторяющихся проходов по сорти-
руемому массиву размера N. За каждый проход элементы последовательно сравниваются попарно и если порядок в паре неверный, то выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны - это будет зна-
чить, что массив отсортирован. При каждом проходе элементы массива, не стоящие на своих местах, будут перемещаться каждый к своему концу массива.
8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Начальное состояние массива |
|
|
8 23 5 65 44 33 1 6 |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 23 5 65 44 33 1 6 |
|
||||||||||
|
8 5 23 65 44 33 1 6 |
|||||||||||
|
8 5 23 65 44 33 1 6 |
|||||||||||
Шаг 1 |
8 5 23 44 65 33 1 6 |
|||||||||||
|
8 5 23 44 33 65 1 6 |
|||||||||||
|
8 5 23 44 33 1 65 6 |
|||||||||||
|
|
|
|
|
|
|
|
|
||||
|
|
8 5 23 44 33 1 6 |
65 |
|||||||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
||||
|
5 8 23 44 33 1 6 |
65 |
||||||||||
|
5 8 23 44 33 1 6 |
65 |
||||||||||
Шаг 2 |
5 8 23 44 33 1 6 |
65 |
||||||||||
5 8 23 33 44 1 6 |
65 |
|||||||||||
|
||||||||||||
|
5 8 23 33 1 44 6 |
65 |
||||||||||
|
|
|
|
|
|
|
|
|||||
|
|
5 8 23 33 1 6 |
44 |
65 |
||||||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 8 23 33 1 6 44 |
65 |
||||||||||
|
5 8 23 33 1 6 44 |
65 |
||||||||||
Шаг 3 |
5 8 23 33 1 6 44 |
65 |
||||||||||
|
5 8 23 1 33 6 44 |
65 |
||||||||||
|
|
|
|
|
|
|
||||||
|
|
5 8 23 1 6 |
33 44 |
65 |
||||||||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 8 23 1 6 33 44 |
65 |
||||||||||
Шаг 4 |
5 8 23 1 6 33 44 |
65 |
||||||||||
5 8 1 23 6 33 44 |
65 |
|||||||||||
|
||||||||||||
|
|
|
|
|
|
|||||||
|
|
5 8 1 6 |
23 33 44 |
65 |
||||||||
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 8 1 6 23 33 44 |
65 |
||||||||||
Шаг 5 |
5 1 8 6 23 33 44 65 |
|||||||||||
|
|
|
|
|
||||||||
|
|
5 1 6 |
8 23 33 44 |
65 |
||||||||
|
|
|
|
|
||||||||
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Шаг 6 |
1 5 6 8 23 33 44 |
65 |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
||
|
1 5 |
6 8 23 33 44 |
65 |
|||||||||
|
|
|||||||||||
|
|
|
||||||||||
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 6 8 23 33 44 65 |
||||||||
Шаг 7 |
|
1 |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9
Описание алгоритма быстрой сортировки
Быстрая сортировка - широко известный алгоритм сортировки, разрабо-
танный английским математиком Чарльзом Хоаром.
1.Выбирается в массиве некоторый элемент, который называется опорным элементом.
2.Производится операция разделения массива: он реорганизуется таким образом, чтобы все элементы со значением меньшим или равным опор-
ному элементу оказались слева от него, а все элементы, превышающие по значению опорный, справа от него. Обычный алгоритм операции:
2.1.Два индекса - l и r, приравниваются к минимальному и макси-
мальному индексу разделяемого массива соответственно.
2.2.Вычисляется индекс опорного элемента m.
2.3.Индекс l последовательно увеличивается до тех пор, пока l-й эле-
мент не окажется больше либо равен опорному.
2.4.Индекс r последовательно уменьшается до тех пор, пока r-й эле-
мент не окажется меньше либо равен опорному.
2.5.Если r=l, то найдена середина массива и операция разделения за-
кончена, оба индекса указывают на опорный элемент.
2.6.Если l<r, то в найденной паре элементы нужно обменять местами
и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l
или r) дошла до опорного элемента, то при обмене значение m из-
менится на r-й или l-й элемент, соответственно изменится индекс опорного элемента и алгоритм продолжит свое выполнение.
3.Рекурсивно упорядочиваются подмассивы, лежащие слева и справа от опорного элемента.
4.Базой рекурсии являются наборы, состоящие из одного или двух элемен-
тов. Первые возвращаются в исходном виде, во вторых, при необходимо-
10
сти, сортировка сводится к перестановке двух элементов. Все такие от-
резки уже упорядочены в процессе разделения.
|
|
|
Начальное состояние массива |
8 23 5 65 |44| 33 1 6 |
|
|
|
|
|
|
|
|
|
|
|
|--------| |
|
Шаг 1 (в качестве x выбира- |
8 23 5 6 44 33 1 65 |
|
ется a[5]) |
|---| |
|
|
8 23 5 6 1 33 44 65 |
|
|
|
|
|
|
|
|
|
|
|
8 23 |5| 6 1 33 44 65 |
|
Шаг 2 (в подмассиве a[1] ... |
|--------| |
|
a[5] в качестве x выбирается |
1 23 5 6 8 33 44 65 |
|
a[3]) |
|--| |
|
|
1 5 23 6 8 33 44 65 |
|
|
|
|
|
|
|
|
|
|
Шаг 3 (в подмассиве a[3] ... |
1 5 23 |6| 8 33 44 65 |
|
a[5] в качестве x выбирается |
|----| |
|
a[4]) |
1 5 8 6 23 33 44 65 |
|
|
|
|
|
|
|
|
|
|
Шаг 4 (в подмассиве a[3] ... |
1 5 8 |6| 23 33 44 65 |
|
|--| |
||
a[4] выбирается a[4]) |
||
1 5 6 8 23 33 44 65 |
||
|
||
|
|
|
|
|
Функция обменной сортировки
void bubble(int* a, int n)
{
for (int i=n-1; i>=0; i--) //цикл проверки на конец массива
{
for (int j=0; j<i; j++) //сдвиг маркера от отсортированного числа
{
if (a[j]>a[j+1]) // сравнение левого и правого элемента
{
11
int tmp=a[j]; // обмен значений через временную переменную a[j]=a[j + 1];
a[j+1]=tmp;
}
}
}
}
void alg_1()
{
clock_t start=0, end=0; //переменная для хранения времени float t1 = 0; // для хранения затраченного времени //задание размера матрицы
const int n=3500;
//объявление матрицы int a[n], i;
//генерация случайных чисел от min=1 до max=3500 //с заполнением ими матрицы
const int min=1, max=3500; srand (time(NULL)); for(i=0; i<n; i++)
a[i]=rand()%(max-min+2)+min; for(i=0; i<n; i++)
printf("\na[%d]=%d", i, a[i]); //вывод сгенерированного массива start=clock(); // начинаем замер времени
bubble(a, n);// <=== сортируем здесь end=clock(); // заканчиваем подсчет времени
t1=(float)(end-start) / CLK_TCK; // считаем затраченное время в секундах //вывод на экран отсортированного массива
for(i=0; i<n; i++) printf("\na[%d]=%d", i, a[i]);
printf("\nT=%lf\n", t1); // выводим время выполнения сортировки getch();
}
Функция быстрой сортировки
void qs(int* s_arr, int first, int last)
{
int i=first, j=last, x=s_arr[(first+last)/2]; // x середина массива do {
while (s_arr[i]<x) i++; // сравниваем значения начальных элементов со средним элементом
while (s_arr[j]>x) j--; // сравниваем значения конечных элементов со средним элементом
12