Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Структуры и алгоритмы обработки данных. Сортировка массивов и динамические структуры (90

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
676.59 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра информатики

СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ СОРТИРОВКА МАССИВОВ И ДИНАМИЧЕСКИЕ СТРУКТУРЫ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ для студентов

к лабораторным работам по курсу

«Структуры и алгоритмы обработки данных»

Р.В. Батищев

Липецк Липецкий государственный технический университет

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]