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


#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>

// Очистка экрана (Linux/Unix)
void clearScreen() {
    printf("\033[H\033[J");
}

// Пауза с ожиданием нажатия Enter
void pause() {
    printf("\nНажмите Enter для продолжения...");
    // очищаем возможный "мусор" во входном буфере
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {}
    getchar();
}

// Функция вывода массива
void printArray(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// Функция шейкерной (пузырьковой двунаправленной) сортировки
void shakerSort(int* arr, int size, int srt, long* count) {
    *count = 0;             // Обнуляем счетчик перестановок
    int left = 0;
    int right = size - 1;

    while (left < right) {
        // Проход слева направо ("всплытие" большего/меньшего элемента вправо)
        for (int i = left; i < right; i++) {
            int cond = srt ? (arr[i] > arr[i + 1]) : (arr[i] < arr[i + 1]);
            if (cond) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                (*count)++;
            }
        }
        right--;

        // Проход справа налево ("всплытие" элемента влево)
        for (int i = right; i > left; i--) {
            int cond = srt ? (arr[i - 1] > arr[i]) : (arr[i - 1] < arr[i]);
            if (cond) {
                int temp = arr[i];
                arr[i] = arr[i - 1];
                arr[i - 1] = temp;
                (*count)++;
            }
        }
        left++;
    }
}

int main() {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    srand((unsigned int)time(NULL));

    FILE* f;
    int size;
    int* arr;
    char ch;
    long count = 0;

    do {
        clearScreen();
        printf("МЕНЮ:\n");
        printf("1 - Сортировка случайных значений по возрастанию\n");
        printf("2 - Сортировка случайных значений по убыванию\n");
        printf("3 - Сортировка возрастающих значений по убыванию\n");
        printf("4 - Ввод своего массива для сортировки\n");
        printf("0 - выход\n");
        printf("Выбор: ");

        // Читаем один символ выбора пункта меню
        scanf(" %c", &ch);

        switch (ch) {
        case '1': {
            // Случайные числа по возрастанию
            clearScreen();
            printf("Введите размер массива: ");
            scanf("%d", &size);
            arr = (int*)malloc(size * sizeof(int));

            // Генерация и запись случайных чисел
            f = fopen("input.txt", "w");
            printf("Исходный массив:\n");
            for (int i = 0; i < size; i++) {
                arr[i] = rand() - rand();
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            // Сортировка и замер времени
            clock_t start = clock();
            shakerSort(arr, size, 1, &count);
            clock_t stop = clock();

            // Запись результата
            f = fopen("output.txt", "w");
            printf("\nОтсортированный массив:\n");
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            printf("\nВремя: %.6lf сек\n", (double)(stop - start) / CLOCKS_PER_SEC);
            printf("Перестановок: %ld\n", count);

            free(arr);
            pause();
            break;
        }

        case '2': {
            // Случайные числа по убыванию
            clearScreen();
            printf("Введите размер массива: ");
            scanf("%d", &size);
            arr = (int*)malloc(size * sizeof(int));

            f = fopen("input.txt", "w");
            printf("Исходный массив:\n");
            for (int i = 0; i < size; i++) {
                arr[i] = rand() - rand();
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            clock_t start = clock();
            shakerSort(arr, size, 0, &count);
            clock_t stop = clock();

            f = fopen("output.txt", "w");
            printf("\nОтсортированный массив:\n");
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            printf("\nВремя: %.6lf сек\n", (double)(stop - start) / CLOCKS_PER_SEC);
            printf("Перестановок: %ld\n", count);

            free(arr);
            pause();
            break;
        }

        case '3': {
            // Упорядоченный по возрастанию массив, сортируем по убыванию
            clearScreen();
            printf("Введите размер массива: ");
            scanf("%d", &size);
            arr = (int*)malloc(size * sizeof(int));

            // Генерация возрастающего массива
            f = fopen("input.txt", "w");
            printf("Исходный массив:\n");
            arr[0] = rand() % 1000;
            for (int i = 1; i < size; i++) {
                arr[i] = arr[i - 1] + rand() % 100 + 1;
            }
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            // Сортировка по убыванию
            clock_t start = clock();
            shakerSort(arr, size, 0, &count);
            clock_t stop = clock();

            f = fopen("output.txt", "w");
            printf("\nОтсортированный массив:\n");
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            printf("\nВремя: %.6lf сек\n", (double)(stop - start) / CLOCKS_PER_SEC);
            printf("Перестановок: %ld\n", count);

            free(arr);
            pause();
            break;
        }

        case '4': {
            // Ручной ввод массива
            clearScreen();
            printf("Введите размер массива: ");
            scanf("%d", &size);
            arr = (int*)malloc(size * sizeof(int));

            printf("Введите %d элементов:\n", size);
            for (int i = 0; i < size; i++) {
                scanf("%d", &arr[i]);
            }

            // Выбор направления сортировки
            printf("Выберите направление (1 - возр., 2 - убыв.): ");
            char dir;
            scanf(" %c", &dir);
            int srt1 = (dir == '1') ? 1 : 0;

            f = fopen("input.txt", "w");
            printf("\nИсходный массив:\n");
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            clock_t start = clock();
            shakerSort(arr, size, srt1, &count);
            clock_t stop = clock();

            f = fopen("output.txt", "w");
            printf("\nОтсортированный массив:\n");
            for (int i = 0; i < size; i++) {
                fprintf(f, "%d ", arr[i]);
            }
            printArray(arr, size);
            fclose(f);

            printf("\nВремя: %.6lf сек\n", (double)(stop - start) / CLOCKS_PER_SEC);
            printf("Перестановок: %ld\n", count);

            free(arr);
            pause();
            break;
        }

        case '0':
            break;

        default:
            break;
        }
    } while (ch != '0');

    return 0;
}