Сравнительный анализ времен сортировок
Задача оптимизации используемых алгоритмов, в том числе и сортировки. Перестановка элементов, находящихся не непосредственно друг за другом, а на некотором удалении. Оптимальный выбор компаранда. Эквивалент прямому обходу бинарного дерева поиска.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | отчет по практике |
Язык | русский |
Дата добавления | 14.02.2016 |
Размер файла | 140,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки РФ
Федеральное государственное автономное образовательное учреждение
высшего образования
Направление подготовки "Прикладная математика и информатика"
Отчет
Сравнительный анализ времен сортировок
Дзержинск 2015
Аннотация
Отчет содержит сравнительный анализ времен медленных и быстрых сортировок. Анализ был проведен по таким алгоритмам сортировок, как пузырек, вставка, отбор, быстрая и метод Шелла. На языке С++ были описаны классы реализации сортировок и проведен сравнительный анализ зависимости времени от количества элементов в массиве.
Введение
Используемые в настоящее время объемы данных достигают размеров, которые еще десятилетие назад казались почти невероятными. Чем большими становятся объемы перерабатываемых данных, тем актуальнее становится задача оптимизации используемых алгоритмов, в том числе и сортировки.
Рост требований к скорости алгоритмов сортировки и расширение круга задач, для которых они используются, приводит к тому, что по-прежнему важной и актуальной остается задача сравнительного анализа алгоритмов сортировки.
Целью проведенного исследования было сравнение времен наиболее распространенных алгоритмов сортировки данных в массивах.
Теоретическая часть
Алгоритм сортировки - это алгоритм для упорядочивания элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки.
Важным свойством алгоритма является его сфера применения. Здесь основных типов упорядочения два:
· Внутренняя сортировка оперирует массивами, целиком помещающимися в оперативной памяти с произвольным доступом к любой ячейке. Данные обычно упорядочиваются на том же месте без дополнительных затрат. В современных архитектурах персональных компьютеров широко применяется подкачка и кэширование памяти. Алгоритм сортировки должен хорошо сочетаться с применяемыми алгоритмами кэширования и подкачки.
· Внешняя сортировка оперирует запоминающими устройствами большого объёма, но не с произвольным доступом, а последовательным (упорядочение файлов), то есть в данный момент "виден" только один элемент, а затраты на перемотку по сравнению с памятью неоправданно велики. Это накладывает некоторые дополнительные ограничения на алгоритм и приводит к специальным методам упорядочения, обычно использующим дополнительное дисковое пространство. Кроме того, доступ к данным во внешней памяти производится намного медленнее, чем операции с оперативной памятью. Доступ к носителю осуществляется последовательным образом: в каждый момент времени можно считать или записать только элемент, следующий за текущим; объём данных не позволяет им разместиться в ОЗУ.
Рассмотрим методы сортировки:
· пузырек;
· отбор;
· вставка;
· Шелл;
· быстрая.
Сортировка "пузырьком"
Положим, что исходная сортируемая последовательность длинны N и состоит из единственного значения (ключа). Пусть последовательность безколизионная в смысле значения ключа и представляет собой выборку с нулевым средним и некоторой постоянной дисперсией (распределена по нормальному закону). Т.е утверждаем, что выборка не содержит зон частичной упорядоченности в смысле значения ключа.
Тогда алгоритм сортировки таков:
осуществляем N просмотров исходной последовательности от последнего элемента до i-того элемента сначала, где i определяет номер прохода. При этом на каждом проходе два соседних элемента меняем местами, если их исходный порядок в смысле значения ключа противен требуемому. В результате, на i-ом проходе начальный элемент отсортирован в нужном порядке по ключу. На каждом просмотре в среднем перестановок. Итоговая сложность порядка O().
void SORT :: bubble()
{
long a,b;
short int t;
if(!KeMas){
ErrorCode=4;
ShowMsg();
return;
}
for(a=1; a<KeMas; a++)
for(b=KeMas-1; b>=a; b--)
if(Mas[b-1] > Mas[b]){t=Mas[b-1]; Mas[b-1]=Mas[b]; Mas[b]=t;}
return;
}
Сортировка "вставкой"
На первом шаге сортируем первые два элемента в нужном порядке. Третий элемент выставляется в требуемом порядке относительно первых двух (левее левого, либо на месте, либо между первым и вторым). На следующих шагах аналогично.
void SORT :: insert()
{
long a,b;
short int t;
if(!KeMas){
ErrorCode=7;
ShowMsg();
return;
}
for(a=1; a<KeMas; a++){
t=Mas[a];
for(b=a-1;b>=0 && t<Mas[b]; b--)Mas[b+1]=Mas[b];
Mas[b+1]=t;
}
return;
}
Сортировка "отбором"
Разновидность метода пузырька, иногда алгоритм отбора именуют методом пузырька. Исходная последовательность обладает теми же свойствами.
Просматривая всю последовательность, отбираем минимальный элемент и если на i-ом шаге этот элемент расположен в позиции отличной от i, то меняем i-ый элемент с минимальным местами.
void SORT :: select()
{
long a,b,c;
bool flag;
short int t;
if(!KeMas){
ErrorCode=6;
ShowMsg();
return;
}
for(a=0; a<KeMas-1; a++){
flag=false;
c=a;
t=Mas[a];
for(b=a+1; b<KeMas; b++)
if(Mas[b] < t){c=b; t=Mas[b]; flag=true;}
if(flag){Mas[c]=Mas[a]; Mas[a]=t;}
}
return;
}
Сортировка "Шелла"
Алгоритм осуществляет перестановку элементов, находящихся не непосредственно друг за другом, а на некотором удалении. При этом шаг удаления определяется значениями некоторой сходящейся последовательности. Последняя перестановка должна осуществляться с шагом единица.
Доказано, что наихудшая временная сходимость - степень двойки.
void SORT :: Shell()
{
long gap,i,j;
short int t;
if(!KeMas){
ErrorCode=8;
ShowMsg();
return;
}
for(gap=KeMas/2; gap>0; gap/=2)
for(i=gap; i<KeMas; i++)
for(j=i-gap; j>=0 && Mas[j]>Mas[j+gap]; j-=gap){
t=Mas[j]; Mas[j]=Mas[j+gap]; Mas[j+gap]=t;
}
}
"Быстрая" сортировка
"Быстрая" сортировка является самым быстрым алгоритмом из всех рассмотренных; относится к классу перестановочных.
Суть алгоритма в разбиении исходной последовательности на разделы в смысле некоторого значения (компаранда).
Идея - изначально массив делится на 2 части. Компаранд может выбираться случайно, или осреднением некоторой части сортируемого, или берётся экстремум из массива (наихудший случай). Оптимально выбрать компаранд, как значение расположенное точно в середине диапазона значений. Если выбирается срединный элемент, то временная сложность log2 N алгоритм бинарный компаранд
Сам алгоритм эквивалентен прямому обходу бинарного дерева поиска, построенному по исходным данным.
void SORT :: quick()
{
if(!KeMas){
ErrorCode=9;
ShowMsg();
return;
}
qs(Mas,0,KeMas-1);
}
void SORT :: qs(short int *A, long left, long right)
{
long i,j;
int x,y;
i=left; j=right;
x=A[(left+right)/2];
do
{
while(A[i] < x && i<right) i++;
while(x< A[j] && j > left)j--;
if(i <= j){
y=A[i];
A[i]=A[j];
A[j]=y;
i++; j--;
}
}while(i<=j);
if(left < j) qs(A,left,j);
if(i < right) qs(A,i,right);
}
Постановка задачи
Написать программу на языке C++, в которой будут описываться классы сортировок. Провести сравнительный анализ времен сортировки, проведенной различными методами над целочисленной последовательностью данных длиной N, в зависимости от N.
Описание классов
Класс генерации случайных чисел
Класс выдает случайные числа равномерно распределенные в фиксированном диапазоне. Используется детерминистический алгоритм, начинающийся с инициализирующего (seed) значения. Процесс генерации детерминистический (берет фиксированное начальное значение и выполняет фиксированный набор действий).
Выход алгоритма - уникальный случайный, определяется входными данными и инструкциями. Благодаря начальной зависимости от seed-значения, ГСЧ создает одну и ту же случайную последовательность при обращении к ГСЧ с одним и тем же seed-значением.
Класс обеспечивает автоматический выбор seed-значения, если параметром конструкции выступает пустота и пользователь получает независимые друг от друга псевдослучайные последовательности. Если же в качестве параметра задавать одно и то же значение, то при каждом обращении случайная последовательность повторяется.
Алгоритм генерации линейный конгруэнтный, использующий большой нечетный постоянный множитель и постоянное слагаемое, которое вместе с seed-значением служит для итеративного создания псевдослучайных чисел и обновления seed-значения.
Объявление класса RandomNumber:
#ifndef CL_RANDOM_H
#define CL_RANDOM_H
typedef unsigned long UL;
class RandomNumber {
public:
RandomNumber(UL S = 0); //ГСЧ в диапазоне от 0 до n-1
unsigned short int Random(UL n); //ГСЧ в диапазоне [0..1]
double fRandom(void);
public: // constants
static const UL maxshort = 65535L;
static const UL multipier = 1194211693L;
static const UL adder = 12345L;
private:
UL randSeed;
};
#endif
Класс сортировки
Класс SORT имеет следующие методы
SORT(unsigned long seed);
~SORT(void);
long ShowKeIsxMax(void);
void ShowMsg(void);
short int GetErrorCode(void);
void InitMas(long N);
void ProvSort(void);
void bubble(void);
void select(void);
void insert(void);
void Shell(void);
void quick(void);
void qs(short int *A, long left, long right);
SORT(unsigned long seed) - конструктор класса
long ShowKeIsxMax(void) - возвращает в качестве своего значения максимальное количество элементов массива для сортировки.
void ShowMsg(void) - метод в качестве значений выдает текст ошибки по ее коду (коду ошибки)
short int GetErrorCode(void) - методо возвращает в качестве своего значения код ошибки.
void InitMas(long N) - заполнение массива выборки N элементов из массива генеральной совокупности.
void ProvSort(void) - проверка массивов на 2 ошибки, ошибку захвата памяти и ошибку сортировки.
void bubble(void) - метод реализующий метод сортировки пузырьком.
void select(void) - метод реализующий метод сортировки выборкой
void insert(void) - метод реализующий метод сортировки вставкой
void shell(void) - метод реализующий метод сортировки Шелла.
void qs(void) - метод реализующий метод быстрой сортировки
void quick() - метод в котором происходит проверка массива данных для метода qs.
Анализ времен сортировок
"Медленные" сортировки
По графику видно, что временная сложность сортировок составляет порядка N^2.
"Быстрые" сортировки
Для метода Шелла временная сложность N1/2 и для быстрой сортировки временная сложность log2N.
Заключение
Проведя анализ, получили, что сортировки пузырек, отбор и вставка являются медленными сортировками, с временной сложностью N2. А сортировки методом Шелла и "быстрая" относятся к быстрым сортировкам с временной сложностью N1/2 и log2N соответственно.
Размещено на Allbest.ru
Подобные документы
Разработка программы на языке С#, которая будет заниматься построением бинарного дерева для исходных данных и их редактированием, поиском информации о товарах по заданному ключу. Графические схемы алгоритмов поиска и удаления элемента бинарного дерева.
курсовая работа [796,9 K], добавлен 22.02.2016Обработка массивов элементов любого типа как главное назначение алгоритмов сортировки. Анализ наиболее используемых алгоритмов сортировки: пузырьком, выбором, вставками, методом Шелла и быстрой сортировкой. Основные требования к алгоритмам сортировки.
реферат [189,8 K], добавлен 06.12.2014Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.
курсовая работа [1,7 M], добавлен 16.04.2012Понятие "сортировка" как упорядочение элементов некоторой последовательности, ее цель и методы. Разработка алгоритмов, подпрограмм сортировок различного рода, анализ и вычисление среднего времени каждой сортировки, составление графического меню.
курсовая работа [165,4 K], добавлен 24.06.2012Сутність і структурні елементи бінарного дерева, характеристика методів його обходу (в прямому, симетричному та зворотному порядку). Вибір мови програмування, середовища розробки та технічних засобів. Структура даних і модулів системи, порядок її роботи.
дипломная работа [1,4 M], добавлен 12.07.2013Алгоритмы сортировки методами простых вставок и пузырька. Зависимость среднего времени сортировки от числа сортируемых элементов. Функции, осуществляющие сортировку любого количества элементов методом простых вставок, на основе сортировки таблицы адресов.
курсовая работа [557,1 K], добавлен 26.05.2010Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.
лабораторная работа [1,2 M], добавлен 23.07.2012Рассмотрение нелинейных динамических структур данных в виде бинарного дерева. Построение дерева двоичного поиска. Реализация трех обходов дерева, выведение обходов на экран компьютера. Разработка текста программы. Симметричноправая прошивка дерева.
контрольная работа [81,6 K], добавлен 14.12.2011Исследование особенностей основных файловых менеджеров, разработанных под операционную систему Windows. Изучение порядка заполнения элементов бинарного дерева. Обзор приложения, реализующего графический интерфейс доступа пользователя к папкам и файлам.
курсовая работа [2,9 M], добавлен 11.07.2012Описание алгоритма сортировки с двоичным включением, выбор структур данных. Пример сортировки массива, отсортированного случайным образом. Алгоритм покрытия по методу "Построение одного кратчайшего покрытия". Волновой алгоритм поиска длиннейшего пути.
курсовая работа [78,2 K], добавлен 24.09.2010