Санкт-Петербургский государственный электротехнический

advertisement
Санкт-Петербургский государственный электротехнический университет “ЛЭТИ” им. Ульянова
(Ленина).
Кафедра МОЭВМ.
Алгоритмы и структуры данных.
Отчёт по лабораторной работе №1.
Выполнил: Базанков Алексей Дмитриевич.
Проверил: Романенко Дмитрий Александрович.
Дата выполнения: 16.05.2013.
Санкт-Петербург
2013
1. Задание лабораторной работы.
Усовершенствованный метод – быстрая сортировка.
2. Теоретические сведения.
Быстрая сортировка (quicksort) - широко известный алгоритм сортировки, разработанный
английским Информатиком Чарльзом Хоаром в МГУ в 1960 году. Один из быстрых известных
универсальных алгоритмов сортировки массивов (в среднем O(n log n) обменов при
упорядочении n элементов).
Краткое описание алгоритма.
 Выбрать элемент, называемый опорным.
 Сравнить все остальные элементы с опорным, на основании сравнения разбить множество
на три — «меньшие опорного», «равные» и «большие», расположить их в порядке
меньшие-равные-большие.
 Повторить рекурсивно для «меньших» и «больших».
Представленный алгоритм имеет так называемое трёхчастное разделение. В лабораторной работе
будет использовано двухчастное разделение, при котором элементы будут разбиты на два множества
– «меньшие опорного» и «большие либо равные» опорному. Заметим, что опорным элементом
называется элемент, который разделяет множества упомянутые выше. С точки зрения корректности
алгоритма выбор опорного элемента безразличен. С точки зрения повышения эффективности
алгоритма выбираться должна медиана, но без дополнительных сведений о сортируемых данных её
обычно невозможно получить. Известные стратегии: выбирать постоянно один и тот же элемент,
например, средний или последний по положению; выбирать элемент со случайно выбранным
индексом. В данной лабораторной работе будет выбираться средний элемент по положению.
3. «Быстрая сортировка», реализованная на С++.
void qSort(int *A, int low, int high) {
int i = low; int j = high;
int x = A[(low+high)/2];
do {
while(A[i] < x) ++i;
while(A[j] > x) --j;
if(i <= j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
i++; j--;
}
} while(i < j);
if(low < j) qSort(A, low, j);
if(i < high) qSort(A, i, high);
}
Для начала рассчитываем опорный элемент x. Далее сортируем все элементы на «большие
либо равные» и «меньшие». Для этого проходим итеративно массив с начала, пока не найдётся
элемент меньше опорного. Затем итеративным обходом массива с конца ищем элемент больше
опорного и, если нашли, то обменяем найденные элементы. Повторим это, пока элементы не будут
распределены на группы.
Затем обрабатываем левую и правую части массива, если это необходимо, вызывая функцию
рекурсивно.
4. Особенности программы.
Программа в лабораторной работе написана на языке С++ с использованием SDK Windows
Forms. В программе создана форма Form form1, на которой находятся объекты управления, такие
как:





Button.
CheckBox.
NumericUpDown.
TextBox.
Panel и др.
Программа будет выполнять функции визуализации метода, а также тестирования со
сравнением со стандартной функцией qsort из библиотеки stdlib.
Визуализация.
Для визуализации использован объект типа Panel, в котором будет производиться отрисовка
элементов. При этом элементы выглядят не совсем обычным образом. Элементы представлены в
виде прямоугольников определённого цвета. Цвет, в свою очередь, рассчитывается в зависимости от
значения элемента. В программе возможен выбор отображения в двух режимах: ручном и
автоматическом. В автоматическом режиме визуализация происходит с помощью задержки на 1
секунду. В ручном режиме задержка происходит до тех пор, пока пользователь не нажмёт кнопку
«Далее». Для работы визуализации пользователь должен указать размер массива, а также область
рандомизации. Тип данных в программе – целочисленный (int). Вид пункта Визуализация
представлен на рисунке ниже.
Размер массива
Пошаговый режим
Минимум и
максимум массива
Поле отображения
массива
Тестирование.
Как уже говорилось, для тестирования метода быстрой сортировки, написанной в ходе
лабораторной работы, она сравнивается со стандартной быстрой сортировкой из библиотеки «stdlib».
Методы сравниваются количеством затраченного времени. Время рассчитываются разностью между
временем в начале и в конце сортировки. Текущее время определяется с помощью функции clock()
библиотеки «ctime». Размеры массивов при тестировании будут изменяться от 1 до 1.000.000 с шагом
– умножить на 10. Тестирование метода сортировки представлено в таблице ниже.
Испытания проводились при количестве элементов – 1.000.000 и при области рандомизации –
от 0 до 3.000.000.
5. Примеры работы программы. Визуализация.
6. Пример работы программы. Тестирование.
Вывод: в результате выполнения лабораторной работы была подробно рассмотрена быстрая
сортировка – одна из наибольшее эффективных и изящных в настоящее время; также проведены
испытания и создана программа-визуализатор сортировки, что можно использовать в научных целях.
Download