Добавил:
YunonaKuzmicheva
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:тимсорт
.txt#include <iostream>
#include <conio.h>
using namespace std;
const int MIN_RUN = 32;
void ShowMenu(int str)
{
system("cls");
cout << "СОРТИРОВКИ" << endl;
printf("%s1. Динамический массив\n", str == 1 ? " => " : " ");
printf("%s2. Сортировка 'Timsort'\n", str == 2 ? " = > " : " ");
printf("%s3. Выход\n", str == 3 ? " => " : " ");
}
//ДИНАМИЧЕСКИЙ МАССИВ ///////////////////////////////////
void ShowMenu2(int str)
{
system("cls");
cout << "ДИНАМИЧЕСКИЙ МАССИВ" << endl;
printf(" Выберите одно из действий:\n");
printf("%s1. Создать новый массив\n", str == 1 ? " => " : " ");
printf("%s2. Добавить новый элемент\n", str == 2 ? " => " : " ");
printf("%s3. Удалить элемент\n", str == 3 ? " => " : " ");
printf("%s4. Назад\n", str == 4 ? " => " : " ");
}
class DynamicArray {
private:
int* arr; // указатель на массив
int size; // размер массива
public:
DynamicArray() {
arr = nullptr;
size = 0;
}
DynamicArray(int initialSize) {
arr = new int[initialSize];
size = initialSize;
}
~DynamicArray() {
delete[] arr;
}
//изменение размера
void resize(int newSize) {
if (newSize == size) {
return;
}
int* newArr = new int[newSize];
// Копирование элементов из старого массива в новый
int elementsToCopy = min(size, newSize);
for (int i = 0; i < elementsToCopy; i++) {
newArr[i] = arr[i];
}
delete[] arr;
arr = newArr;
size = newSize;
}
void addElement(int value, int position) {
if (position < 0 || position > size) {
throw out_of_range("Позиция вне диапазона");
}
resize(size + 1);
// Сдвиг элементов вправо, начиная с индекса position
for (int i = size - 1; i > position; i--) {
arr[i] = arr[i - 1];
}
// Вставка нового элемента
arr[position] = value;
}
void removeElement(int position) {
if (position < 0 || position >= size) {
throw out_of_range("Позиция вне диапазона");
}
// Сдвиг элементов влево, начиная с индекса position + 1
for (int i = position; i < size - 1; i++) {
arr[i] = arr[i + 1];
}
resize(size - 1);
}
int getSize() const {
return size;
}
int& operator[](int position) {
if (position < 0 || position >= size) {
throw out_of_range("Позиция вне диапазона");
}
return arr[position];
}
};
///////////////////////////////////////////////////////////////
//сортировка вставкой
void insertionSort(int arr[], int left, int right) {
for (int i = left + 1; i <= right; i++) {
int key = arr[i];
int j = i - 1;
while (j >= left && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
//сортировка слиянием
void merge(int arr[], int left, int mid, int right) {
int len1 = mid - left + 1;
int len2 = right - mid;
int* leftArr = new int[len1];
int* rightArr = new int[len2];
for (int i = 0; i < len1; i++)
leftArr[i] = arr[left + i];
for (int i = 0; i < len2; i++)
rightArr[i] = arr[mid + 1 + i];
int i = 0, j = 0, k = left;
while (i < len1 && j < len2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
}
else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < len1) {
arr[k] = leftArr[i];
k++;
i++;
}
while (j < len2) {
arr[k] = rightArr[j];
k++;
j++;
}
delete[] leftArr;
delete[] rightArr;
}
//наименьший размер отсортированного массива
int minRunLength(int n) {
int r = 0;
while (n >= MIN_RUN) {
r |= n & 1;
n >>= 1;
}
return n + r;
}
void timSort(int arr[], int n) {
int minRun = minRunLength(n);
for (int i = 0; i < n; i += minRun)
insertionSort(arr, i, min((i + minRun - 1), (n - 1)));
for (int size = minRun; size < n; size *= 2) {
for (int left = 0; left < n; left += 2 * size) {
int mid = left + size - 1;
int right = min((left + 2 * size - 1), (n - 1));
merge(arr, left, mid, right);
}
}
}
int main() {
setlocale(0, "");
int str = 1, ind = 3, usl = 0;
int com;
srand(time(nullptr));
DynamicArray arr(20);
int n; //количество элементов в массиве
int value2 = 0, position2 = 0;
int com2;
int str2 = 1, ind2 = 4, usl2 = 0;
while (usl == 0) {
ShowMenu(str);
com = _getch();
if (com >= '1' && com <= '3') str = com - '0';
if (com == 224) {
com = _getch();
switch (com) {
case 72:
str = (str - 1 + 2) % 3 + 1;
break;
case 80:
str = (str - 1 + 1) % 3 + 1;
break;
}
}
if (com == 13)
{
switch (str)
{
case 1:
system("cls");
while (usl2 == 0) {
ShowMenu2(str2);
com2 = _getch();
if (com2 >= '1' && com2 <= '4') str2 = com2 - '0';
if (com2 == 224) {
com2 = _getch();
switch (com2) {
case 72:
str2 = (str2 - 1 + 3) % 4 + 1;
break;
case 80:
str2 = (str2 - 1 + 1) % 4 + 1;
break;
}
}
if (com2 == 13)
{
switch (str2)
{
case 1: //создание массива
system("cls");
cout << "Введите количество элементов:" << endl;
cin >> n;
arr.resize(n);
for (int i = 0; i < arr.getSize(); i++) {
arr[i] = rand() % 1001; // Заполнение массива рандомными числами от 0 до 1000
}
cout << "Текущий массив:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива
}
cout << endl;
system("pause");
break;
case 2: //добавление эл-та
while (1) {
system("cls");
cout << "Текущий массив:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива
}
cout << endl;
cout << "Новый элемент:" << endl;
cin >> value2;
cout << "Позиция (начиная с 1):" << endl;
cin >> position2;
if (position2 < 1 || position2 > arr.getSize()+1) {
cout << "Введено неверное значение или позиция выходит за границы списка!" << endl;
system("pause");
}
else {
arr.addElement(value2, position2-1);
cout << "Результат:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива после добавления
}
cout << endl;
system("pause");
break;
}
}
break;
case 3: //удаление эл-та
system("cls");
cout << "Текущий массив:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива
}
cout << endl;
cout << "Позиция (начиная с 1):" << endl;
cin >> position2;
arr.removeElement(position2 - 1);
cout << "Результат:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива после удаления
}
cout << endl;
system("pause");
break;
case 4:
usl2 = 1;
str2 = 1;
break;
}
}
}
usl2 = 0;
break;
case 2:
system("cls");
cout << "Исходный массив:" << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " "; // Вывод элементов массива
}
cout << endl;
for (int i = 0; i < 1; i++) {
timSort(&arr[i], arr.getSize());
cout << "Отсортированный массив:" << endl;
for (int i = 0; i < arr.getSize(); i++)
cout << arr[i] << " ";
}
cout << endl;
system("pause");
break;
case 3:
system("cls");
return 0;
break;
}
}
}
}
Соседние файлы в предмете Алгоритмы и системы данных
