Untitled
unknown
plain_text
2 years ago
9.0 kB
5
Indexable
#include <iostream> #include <ctime> template <typename type> class Vector { private: int size; type* vector; public: Vector() { vector = nullptr; size = 0; } Vector(int size_vector) { this->size = size_vector; if (size >= 0) { vector = new type[size]; for (int i = 0; i < size; i++) { vector[i] = 0; } } if (size < 0) { throw ("Размер массива меньше 0"); } } ~Vector() { delete[] vector; } int getSize() { return size; } void resize(int size_vector) { if (size_vector >= 0) { type* vector_vector = new type[size_vector]; if (size_vector > size) { for (int i = 0; i < size; i++) { vector_vector[i] = vector[i]; if (i == size - 1) { for (int j = 0; j < size_vector; j++) { vector_vector[j] = 0; } } } } if (size_vector < size) { for (int i = 0; i < size_vector; i++) { vector_vector[i] = vector[i]; } } if (size_vector < 0) { throw "Новый размер массива меньше 0"; } this->size = size_vector; delete[] vector; vector = vector_vector; std::cout << vector; vector_vector = nullptr; } if (size_vector < 0) { throw "Новый размер массива меньше 0"; } } void resize(int size_vector, type buf) { if (size_vector >= 0) { type* vector_vector = new type[size_vector]; if (size_vector > size) { for (int i = 0; i < size; i++) { vector_vector[i] = vector[i]; if (i == size - 1) { for (int j = i; j < size_vector; j++) { vector_vector[j] = buf; } } } } if (size_vector < size) { for (int i = 0; i < size_vector; i++) { vector_vector[i] = vector[i]; } } if (size_vector < 0) { throw "Новый размер массива меньше 0"; } this->size = size_vector; delete[] vector; vector = vector_vector; vector_vector = nullptr; } } void output() { for (int i = 0; i < size; i++) { std::cout << vector[i] << " "; } std::cout << std::endl; } void empty() { if (size == 0) { std::cout << "Вектор пуст" << std::endl; } else std::cout << "Вектор имеет значения" << std::endl; } void push_back(int value) { double* vector1 = new double[size + 1]; vector1[size] = value; for (int i = 0; i < size; i++) { vector1[i] = vector[i]; } vector = vector1; size += 1; } void pop_back() { double* vector1 = new double[size - 1]; for (int i = 0; i < size - 1; i++) { vector1[i] = vector[i]; } vector = vector1; size -= 1; } void insert(double value) { double* vector1 = new double[size + 1]; vector1[0] = value; for (int i = 1; i < size + 1; i++) { vector1[i] = vector[i - 1]; } vector = vector1; size += 1; } void insert(int it, int n, double value) { size += n; double* vector1 = new double[size]; for (int i = 0; i < size; i++) { if (i < it) { vector1[i] = vector[i]; } else if ((i >= it) && (i < it + n)) { vector1[i] = value; } else { vector1[i] = vector[i - n]; } } vector = vector1; } void front() { if (size != 0) { std::cout << "Значение первой ячейки " << vector[0] << std::endl; } else std::cout << "Вектор пуст" << std::endl; } void back() { if (size != 0) { std::cout << "Значение последней ячейки " << vector[size - 1] << std::endl; } else std::cout << "Вектор пуст " << std::endl; } void erase(int it) { size -= 1; double* vector1 = new double[size]; for (int i = 0; i < size; i++) { if (i < it) { vector1[i] = vector[i]; } else { vector1[i] = vector[i + 1]; } } vector = vector1; } void clear() { delete[] vector; size = 0; vector = nullptr; } void swap1() //вставками { int counter = 0; for (int i = 1; i < size - 1; i++) { for (int j = i; j > 0 && vector[j - 1] > vector[j]; j--) { counter++; int tmp = vector[j - 1]; vector[j - 1] = vector[j]; vector[j] = tmp; } } std::cout << "Количество перестановок = " << counter << std::endl; } void Merge(Vector<type> vector) { int s = vector.getSize(); if (s < 2) { return; } int mid = s / 2; Vector<type> left(mid); Vector<type> right(s - mid); for (int i = 0; i < mid;i++) { left[i] = vector[i]; } for (int i = mid; i < s; i++) { right[i-mid] = vector[i]; } Merge(left); Merge(right); MergeSort(vector, left, right); } void MergeSort(Vector<type> vector, Vector<type> a, Vector<type> b) { int aminindex = 0; int bminindex = 0; int as = a.getSize(); int bs = b.getSize(); int targetVminindex = 0; while (aminindex < as && bminindex < bs) { if (a[aminindex] <= b[bminindex]) { vector[targetVminindex] = a[aminindex]; aminindex++; } else { vector[targetVminindex] = b[bminindex]; bminindex++; } targetVminindex++; } while (aminindex < as) { vector[targetVminindex] = a[aminindex]; aminindex++; targetVminindex++; } while (bminindex < bs) { vector[targetVminindex] = b[bminindex]; bminindex++; targetVminindex++; } } void input_size_ubivanie() { type* vector_vector = new type[size]; for (int i = 0; i < size; i++) { vector_vector[i] = size - i; } delete[] vector; vector = vector_vector; vector_vector = nullptr; } void input_size_vozrastanie() { type* vector_vector = new type[size]; for (int i = 0; i < size; i++) { vector_vector[i] = i; } delete[] vector; vector = vector_vector; vector_vector = nullptr; } void input_size_random() { type* vector_vector = new type[size]; for (int i = 0; i < size; i++) { vector_vector[i] = rand() % 10000; } delete[] vector; vector = vector_vector; vector_vector = nullptr; } type& operator[](int index) { return vector[index]; } }; int main() { float start_time, end_time; int index_first, index_second, size, buf, index; setlocale(LC_ALL, "rus"); std::cout << "Введите размер массива" << std::endl; std::cin >> size; Vector<int> vector_one(size); std::cout << "\n-----" << std::endl; //-----------— std::cout << "СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ ВСТАВКАМИ" << std::endl; vector_one.input_size_vozrastanie(); start_time = clock(); vector_one.swap1(); end_time = clock(); std::cout << std::endl; std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; std::cout << "СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ ГНОМЬЯ" << std::endl; vector_one.input_size_vozrastanie(); start_time = clock(); vector_one.Merge(vector_one); end_time = clock(); std::cout << std::endl; std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; std::cout << "СОРТИРОВКА МАССИВА ПО УБЫВАНИЮ ВСТАВКАМИ" << std::endl; vector_one.input_size_ubivanie(); start_time = clock(); vector_one.swap1(); end_time = clock(); std::cout << std::endl; std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; std::cout << "СОРТИРОВКА МАССИВА ПО УБЫВАНИЮ ГНОМЬЯ" << std::endl; vector_one.input_size_ubivanie(); start_time = clock(); vector_one.Merge(vector_one); end_time = clock(); std::cout << std::endl; std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; std::cout << "СОРТИРОВКА МАССИВА СЛУЧАЙНЫХ ЗНАЧЕНИЙ ПУЗЫРЬКОМ" << std::endl; vector_one.input_size_random(); vector_one.output(); start_time = clock(); vector_one.swap1(); vector_one.output(); end_time = clock(); std::cout << std::endl; std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; std::cout << "СОРТИРОВКА МАССИВА СЛУЧАЙНЫХ ЗНАЧЕНИЙ ГНОМЬЯ" << std::endl; vector_one.input_size_random(); vector_one.output(); start_time = clock(); vector_one.Merge(vector_one); end_time = clock(); vector_one.output(); std::cout << "Время выполнения = " << (end_time - start_time) / CLOCKS_PER_SEC << "\n\n" << std::endl; return 0; }
Editor is loading...