Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по лабораторной работе.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2.34 Mб
Скачать

Описание алгоритмов Сортировка пузырьком

Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива.

Реализация алгоритма представлена в приложении 1.

Сортировка слиянием

  1. Массив разбивается напополам до тех пор, пока все подмассивы не будут состоять из одного элемента.

  2. Получившиеся в результате последнего разбиения два отсортированных массивы «сливаются» в один отсортированный (выбором меньшего из двух элементов).

  3. Процедура слияния повторяется для всех совершенных разбиений.

Реализация алгоритма представлена в приложении 2.

Результаты экспериментов

Функция qsort

Ожидаемая трудоемкость: O(n log n)

  1. График зависимости времени сортировки от количества сортируемых элементов для функции qsort

  1. График отношения времени сортировки к функции n log n в зависимости от количества сортируемых элементов

Сортировка пузырьком

Ожидаемая трудоемкость: O(n2), количество сравнений n2-n

  1. График зависимости времени сортировки от количества сортируемых элементов для сортировки пузырьком

  1. График отношения времени сортировки к функции n2-n в зависимости от количества сортируемых элементов

Сортировка слиянием

Ожидаемая трудоемкость: O(n log n)

  1. График зависимости времени сортировки от количества сортируемых элементов для сортировки слиянием

  1. График отношения времени сортировки к функции n log n в зависимости от количества сортируемых элементов

Сравнение сортировок

  1. Сравнение времени сортировок на одном массиве

Заключение

В ходе выполнения лабораторной работы были реализованы две программы: Exp.exe, осуществляющая сортировку массива, и Tests.exe, проводящая серийный запуск Exp.exe. Обе программы удовлетворяют всем требованиям, представленным в разделе «Постановка задачи».

По результатам экспериментов было построено 7 графиков. Рисунки 3, 5, 7 демонстрируют зависимость времени сортировки от числа элементов в сортируемом массиве для соответствующих методов.

Рисунки 4, 6, 8 показывают, что ожидаемая трудоемкость для каждой из сортировок совпадает с реальной, так как функция отношения времени сортировки к ее ожидаемой трудоемкости ведет себя аналогично константе.

Рисунок 9 позволяет сравнить скорость сортировки разными алгоритмами на одном массиве данных. По результатам этого сравнения наиболее быстрым алгоритмом стала сортировка слиянием.

Литература

  1. Сортировка слиянием — Википедия. — [http://ru.wikipedia.org/wiki/Сортировка_слиянием]

  2. 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];

}