
- •Введение
- •Постановка задачи
- •Сортировка
- •Серийный запуск
- •Руководство пользователя
- •Правила ввода аргументов для Exp.Exe
- •Правила ввода аргументов для Tests.Exe Руководство программиста Описание структуры программы
- •Описание структур данных
- •Описание алгоритмов Сортировка пузырьком
- •Приложение 3 Генерация случайных чисел
Описание алгоритмов Сортировка пузырьком
Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива.
Реализация алгоритма представлена в приложении 1.
Сортировка слиянием
Массив разбивается напополам до тех пор, пока все подмассивы не будут состоять из одного элемента.
Получившиеся в результате последнего разбиения два отсортированных массивы «сливаются» в один отсортированный (выбором меньшего из двух элементов).
Процедура слияния повторяется для всех совершенных разбиений.
Реализация алгоритма представлена в приложении 2.
Результаты экспериментов
Функция qsort
Ожидаемая трудоемкость: O(n log n)
График зависимости времени сортировки от количества сортируемых элементов для функции qsort
График отношения времени сортировки к функции n log n в зависимости от количества сортируемых элементов
Сортировка пузырьком
Ожидаемая трудоемкость: O(n2), количество сравнений n2-n
График зависимости времени сортировки от количества сортируемых элементов для сортировки пузырьком
График отношения времени сортировки к функции n2-n в зависимости от количества сортируемых элементов
Сортировка слиянием
Ожидаемая трудоемкость: O(n log n)
График зависимости времени сортировки от количества сортируемых элементов для сортировки слиянием
График отношения времени сортировки к функции n log n в зависимости от количества сортируемых элементов
Сравнение сортировок
Сравнение времени сортировок на одном массиве
Заключение
В ходе выполнения лабораторной работы были реализованы две программы: Exp.exe, осуществляющая сортировку массива, и Tests.exe, проводящая серийный запуск Exp.exe. Обе программы удовлетворяют всем требованиям, представленным в разделе «Постановка задачи».
По результатам экспериментов было построено 7 графиков. Рисунки 3, 5, 7 демонстрируют зависимость времени сортировки от числа элементов в сортируемом массиве для соответствующих методов.
Рисунки 4, 6, 8 показывают, что ожидаемая трудоемкость для каждой из сортировок совпадает с реальной, так как функция отношения времени сортировки к ее ожидаемой трудоемкости ведет себя аналогично константе.
Рисунок 9 позволяет сравнить скорость сортировки разными алгоритмами на одном массиве данных. По результатам этого сравнения наиболее быстрым алгоритмом стала сортировка слиянием.
Литература
Сортировка слиянием — Википедия. — [http://ru.wikipedia.org/wiki/Сортировка_слиянием]
Microsoft Developer Network. — [http://msdn.microsoft.com/]
Приложения
Приложение 1
Сортировка пузырьком
void BubbleSort(float* arr, int num)
{
float swap;
int i, j;
for( i=1; i<num; ++i )
for( j=num-1; j>0; --j)
if( arr[j]<arr[j-1]) {
swap = arr[j];
arr[j] = arr[j-1];
arr[j-1] = swap;
}
}
Приложение 2
Сортировка слиянием
void MergeSort(float* arr, int num)
{
float* arr2 = (float*)malloc(num*sizeof(float));
Split(arr, arr2, 0, num-1);
free(arr2);
}
void Split(float* arr, float* arr2, int first, int last)
{
if ( last!=first )
{
int mid1 = first + (last-first)/2;
int mid2 = mid1+1;
Split(arr, arr2, first, mid1);
Split(arr, arr2, mid2, last);
Merge(arr, arr2, first, mid1, mid2, last);
}
}
void Merge(float* arr, float* arr2, int first1, int last1, int first2, int last2)
{
int ind1 = first1,
ind2 = first2,
i = first1;
do {
if( arr[ind1]<=arr[ind2] ) {
arr2[i]=arr[ind1];
++ind1;
++i;
}
if( ind1<=last1 || ind2<=last2) {
if ( arr[ind2]<arr[ind1] ) {
arr2[i]=arr[ind2];
++ind2;
++i;
}
}
} while ( ind1<=last1 && ind2<=last2 );
while ( ind1 <= last1 ) {
arr2[i]=arr[ind1];
++ind1;
++i;
}
while ( ind2 <= last2 ) {
arr2[i]=arr[ind2];
++ind2;
++i;
}
for( i=first1; i<=last2; ++i )
arr[i]=arr2[i];
}