Санкт-Петербургский государственный электротехнический университет “ЛЭТИ” им. Ульянова (Ленина). Кафедра МОЭВМ. Алгоритмы и структуры данных. Отчёт по лабораторной работе №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. Пример работы программы. Тестирование. Вывод: в результате выполнения лабораторной работы была подробно рассмотрена быстрая сортировка – одна из наибольшее эффективных и изящных в настоящее время; также проведены испытания и создана программа-визуализатор сортировки, что можно использовать в научных целях.