Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

тимсорт

.txt
Скачиваний:
0
Добавлен:
06.10.2025
Размер:
11.63 Кб
Скачать
#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;

            }
        }
    }
    }
Соседние файлы в предмете Алгоритмы и системы данных