Загрузка данных


#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int N = 10000;

void best_case(int* array, int n)
{
	// TODO функция заполняет массив array размером n элементами в прямом порядке (по возрастанию)
	for (int i = 0; i < n; i++) {
		array[i] = i + 1;
	}
	return;
}

void worst_case(int* array, int n)
{
	// TODO функция заполняет массив array размером n элементами в обратном порядке (по убыванию)
	for (int i = n-1; i >= 0; i--) {
		array[i] = n - i;
	}
	return;
}

void average_case(int* array, int n)
{
	// TODO функция заполняет массив array размером n элементами в случайном порядке (с использованием функции rand)
	for (int i = 0; i < n; i++) {
		array[i] = rand();
	}
	return;
}

unsigned long long bubble_sort(int* a, int n)
{
	unsigned long long op_counter = 0;
	// TODO функция реализует сортировку пузырьком массива a размером n по возрастанию 
	// функция возвращает количество операций сравнения элементов - op_counter
	int temp;
	for (int i = 0; i < n-1; i++) {
		for (int j = 0; j < n - 1 - i; j++) {
			op_counter++;
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	return op_counter;
}

unsigned long long bubble_sort_opimized(int* a, int n)
{
	unsigned long long op_counter = 0;
	bool swapped = false;
	int temp;
	// TODO функция реализует оптимизированную сортировку пузырьком массива a размером n по возрастанию 
	// функция возвращает количество операций сравнения элементов - op_counter
	for (int i = 0; i < n - 1 && !swapped; i++) {
		swapped = true;
		for (int j = 0; j < n - 1 - i; j++, op_counter++) {
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				swapped = false;
			}
		}
	}
	return op_counter;
}

unsigned long long comb_sort(int* a, int n)
{
	unsigned long long op_counter = 0;
	// TODO функция реализует сортировку расческой массива a размером n по возрастанию 
	// функция возвращает количество операций сравнения элементов - op_counter
	int gap = n, temp;
	bool sorted = true;
	while (gap > 1 || sorted) {
		gap = static_cast<int>(gap / 1.247330950103979);
		if (gap < 1) {
			gap = 1;
		}
		sorted = false;
		for (int i = 0; i + gap < n; i++) {
			op_counter++;
			if (a[i] > a[i + gap]) {
				temp = a[i];
				a[i] = a[i + gap];
				a[i + gap] = temp;
				sorted = true;
			}
		}
		
	}
	return op_counter;
}


// Функция копирует массив arr2 размером n в arr1
void copy_array(int* arr1, int* arr2, int n)
{
	for (int i = 0; i < n; i++)
	{
		arr1[i] = arr2[i];
	}
}

// Функция проверяет, отсортирован ли массив, чтобы проверить, что сортировки работают :)
void is_sorted(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		if (arr[i] > arr[i + 1])
			throw runtime_error("Array is not sorted!");
	}
}

// Функция добавляет новую строку к файлу таблицы
// sums - массив из 3 чисел, содержащих количество операций сравнения в алгоритмах сортировки: 
// 1) пузрьком 2) оптимизированным пузырьком 3) расческой 
// n - количество элементов в сортируемых массивах
// type - одна из строк "best", "worst", "average" - прямой, обратный, случайный порядок следования элементов
// file - поток, в который записываются значение type, n, sums - т.е. файл таблицы
void add_to_file(unsigned long long* sums, int n, string type, ofstream& file)
{
	file << type << ";" << n << ";";
	for (int k = 0; k < 3; k++)
		file << sums[k] << ";";
	file << "\n";
}

int main()
{
	ofstream file("results.csv"); // создание файла таблицы
	file << "type;size;bubble;optimized_bubble;comb\n"; // создание первой строки в таблице

	// исследуемые размеры массивов для сортировки
	int array_lengths[] = { 4, 8, 16, 32, 64, 128, 256, 512, 1024 }; // Вы можете добавить другие размеры массивов

	for (int i = 0; i < 9; i++) // это цикл по array_lengths
	{
		int n = array_lengths[i]; // n - размер массива, элемент array_lengths 
		// выделяем память на массивы из 4, 8, 64,.. элементов
		// один массив = один алгоритм сортировки
		int* arr = new int[n]; // пузырек
		int* arr2 = new int[n]; // оптимизированный пузырек
		int* arr3 = new int[n]; // расческа 

		unsigned long long sums[3] = { 0 }; // массив, содержащий количество операций сортировки 1) пузырьком 2) оптимизированным пузырьком, 3) расческой

		// Случайный порядок следования элементов:
		for (int j = 0; j < N; j++)
		{
			// TODO сгенерировать случайную последовательность в массив arr
			// TODO скопировать ее в массив arr2
			// TODO скопировать ее в массив arr3
			average_case(arr, n);
			copy_array(arr2, arr, n);
			copy_array(arr3, arr, n);

			// TODO в соответствующем элементе sum накапливаем количество операций для каждой сортировки
			sums[0] += bubble_sort(arr, n);
			sums[1] += bubble_sort_opimized(arr2, n);
			sums[2] += comb_sort(arr3, n);

			// проверка на корректность алгоритма:
			is_sorted(arr, n);
			is_sorted(arr2, n);
			is_sorted(arr3, n);
		}

		// TODO каждый элемент sums нужно усреднить
		sums[0] /= N;
		sums[1] /= N;
		sums[2] /= N;

		add_to_file(sums, n, "average", file); // результаты записываются в файл


		// Прямой порядок следования элементов
		// TODO сгенерировать возрастающую последовательность в массив arr
		// 
		// TODO скопировать ее в массив arr2
		// TODO скопировать ее в массив arr3
		best_case(arr, n);
		for (int u = 0; u < n; u++) {
			arr2[u] = arr[u];
			arr3[u] = arr[u];
		}
		// TODO в соответствующий элемент sum записать количество операций сравнения для каждой сортировки
		sums[0] = bubble_sort(arr, n);
		sums[1] = bubble_sort_opimized(arr2, n);
		sums[2] = comb_sort(arr3, n);
		// проверка на корректность алгоритма:
		is_sorted(arr, n);
		is_sorted(arr2, n);
		is_sorted(arr3, n);

		add_to_file(sums, n, "best", file); // результаты записываются в файл



		// Обратный порядок следования элементов
		// TODO сгенерировать убывающую последовательность в массив arr
		// TODO скопировать ее в массив arr2
		// TODO скопировать ее в массив arr3 
		worst_case(arr, n);
		for (int u = 0; u < n; u++) {
			arr2[u] = arr[u];
			arr3[u] = arr[u];
		}
		// TODO в соответствующий элемент sum записать количество операций сравнения для каждой сортировки
		sums[0] = bubble_sort(arr, n);
		sums[1] = bubble_sort_opimized(arr2, n);
		sums[2] = comb_sort(arr3, n);
		// проверка на корректность алгоритма:
		is_sorted(arr, n);
		is_sorted(arr2, n);
		is_sorted(arr3, n);

		add_to_file(sums, n, "worst", file); // результаты записываются в файл

		// освобождение памяти массивов
		delete[] arr;
		delete[] arr2;
		delete[] arr3;
	}

	file.close(); //закрытие файла
}