Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Коды основных функций / [Код основных функций] Лаб. 1

.pdf
Скачиваний:
39
Добавлен:
03.08.2020
Размер:
64.1 Кб
Скачать

[Код основных функций] Лабораторная работа №1. Сортировка

//Get the current time.

//This function should be used only for measuring time

//(first call, algorithm, second call; then the difference between the values) double getProcTime() {

#if defined(_WIN32) // If Windows:

FILETIME createTime, exitTime, kernelTime, userTime;

if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime) != -1)

return (ULARGE_INTEGER { {userTime.dwLowDateTime, userTime.dwHighDateTime } }).QuadPart / 10000000.L;

return 0;

#else // If Linux or MacOS:

return double(clock()) / CLOCKS_PER_SEC; #endif

}

//Standard sort

template <class T = int>

void standardSort(std::vector<T> & vec) { std::sort(vec.begin(), vec.end());

}

// Bubble sort

template <class T = int>

void bubbleSort(std::vector<T> & vec) {

for (int i = 0, endIdx = vec.size() - 1; i < endIdx; ++i) for (int j = 0; j < endIdx; ++j)

if (vec[j] > vec[j + 1]) std::swap(vec[j], vec[j + 1]);

}

// Shaker sort

template <class T = int>

void cocktailSort(std::vector<T> & vec) { int left = 0, right = vec.size() - 1; while (left <= right) {

for (int i = left; i < right; ++i) if (vec[i] > vec[i + 1])

std::swap(vec[i], vec[i + 1]); --right;

for (int i = right; i > left; --i) if (vec[i - 1] > vec[i])

std::swap(vec[i - 1], vec[i]); ++left;

}

}

//Selection sort template <class T = int>

void selectionSort(std::vector<T> & vec) {

for (int i = 0, len = vec.size(), endIdx = len - 1; i < endIdx; ++i) { int min = i;

for (int j = i + 1; j < len; ++j) if (vec[j] < vec[min]) min = j;

if (min != i) std::swap(vec[i], vec[min]);

}

}

//Insertion sort

template <class T = int>

void insertionSort(std::vector<T> & vec) {

for (int i = 1, len = vec.size(); i < len; ++i) { T itemToInsert(vec[i]);

int j = i - 1;

for (; j >= 0 && vec[j] > itemToInsert; --j) vec[j + 1] = vec[j];

vec[j + 1] = itemToInsert;

}

}

// Shell sort

template <class T = int>

void shellSort(std::vector<T> & vec) {

for (int len = vec.size(), step = len >> 1; step > 0; step >>= 1) for (int i = step; i < len; ++i)

for (int j = i - step; j >= 0 && vec[j] > vec[j + step]; j -= step) std::swap(vec[j], vec[j + step]);

}

// Hoare iterative sort template <class T = int>

void hoareIterativeSort(std::vector<T> & vec) { std::stack<std::pair<int, int>> total; total.push(std::make_pair<int, int>(+0, vec.size() - 1)); while (!total.empty()) {

auto p = total.top(); total.pop();

int left = p.first, right = p.second; while (left < right) {

int i = left, j = right;

T middle = vec[((right - left) >> 1) + left]; while (i < j) {

while (vec[i] < middle) ++i; while (middle < vec[j]) --j;

if (i <= j) std::swap(vec[i++], vec[j--]);

}

if (i < right) total.push(std::make_pair<int, int>(+i, +right)); right = j;

}

}

}

// Merge sort

template <class T = int>

void mergeParts(std::vector<T> & vec, std::vector<T> & temp, int i, int current) { int j = i + current, n = vec.size();

int n1 = std::min(j, n), n2 = std::min(j + current, n), k = i;

while (i < n1 && j < n2) temp[k++] = (vec[i] <= vec[j]) ? vec[i++] : vec[j++]; while (i < n1) temp[k++] = vec[i++];

while (j < n2) temp[k++] = vec[j++];

}

template <class T = int>

void mergeSort(std::vector<T> & vec) { int len = vec.size();

std::vector<T> temp(len);

for (int current = 1, next = current << 1; current < len; current = next, next <<= 1)

{

for (int i = 0; i < len; i += next) mergeParts(vec, temp, i, current);

current = next, next <<= 1; for (int i = 0; i < len; i += next)

mergeParts(temp, vec, i, current);

}

}

Пройденное тестирование:

1.Пустой массив.

2.Массив из одного элемента.

3.Массив большого размера с единственным уникальным элементом.

4.Сортированный по убыванию большой массив.

5.Простые тесты (случайные массивы, неповторяющиеся элементы). Реализуется созданием массива с последовательными значениями и случайной перестановкой его элементов.

6.Сложные тесты (случайные массивы, повторяющиеся элементы).

Проверка осуществляется сравнением получившегося результата и результата стандартной сортировки C++ std::sort.