Шейкерная сортировка (переделать графику) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет! Есть код на пузырьковую сортировку с графической интерпретацией. Написал код для шейкерной сортировки, теперь нужно запихнуть туда графику с пузырьковой. Кто может помочь? Пузырек:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <locale.h>
#include <string.h>
#include <Windows.h>
const int N = 10;
 
void printArray(int arr[], int size, int begin, int action, int sleep) {
    system("cls");
    printf("Сгенерированный массив: \n");
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    int color;
    if (action == 1) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200;
    }
    else if (action == 2) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200 | FOREGROUND_GREEN | 200;
    }
    else if (action == 3) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200 | FOREGROUND_RED | 200;
    }
    for (int i = 0; i < size; i++) {
        if (i == begin || i == begin - 1) {
            SetConsoleTextAttribute(out, color);
            printf(" <%d>", arr[i]);
            SetConsoleTextAttribute(out, DEFAULT_PALETTE);
        }
        else {
            printf("%d ", arr[i]);
        }
    }
    Sleep(sleep);
}
void main() {
    setlocale(LC_ALL, "Russian");
    int A[N] = {};
    int sleep;
    printf("Введите скорость выполнения программы в мс: ");
    scanf("%i", &sleep);
    srand(time(NULL));
    for (int i = 0; i < N; i++) {
        A[i] = rand() % 2001 - 1000;
    }
    int G[N] = {};
    for (int i = 0; i < 10; i++)
        G[i] = A[i];
    for (int i = 0; i < N - 1; i++)
        for (int j = N - 2, c; j >= i; j--) {
            printArray(A, N, j + 1, 1, sleep);
            if (A[j] > A[j + 1]) {
                printArray(A, N, j + 1, 3, sleep);
                c = A[j]; 
                A[j] = A[j + 1];
                A[j + 1] = c;
                printArray(A, N, j + 1, 2, sleep);
            }
            else {
                printArray(A, N, j + 1, 2, sleep);
            }
        }
    system("cls");
    printf("Сгенерированный массив: \n");
    for (int i = 0; i < N; i++)
        printf("%d ", G[i]);
    printf("\n\nОтсортированный массив: \n");
    for (int i = 0; i < N; i++)
        printf("%d ", A[i]);
    printf("\n\nДля продолжения нажмите любую клавишу ...");
    _getch();
}
Шейкер:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
 
const int N = 8;
 
void Swap(int *mas, int i) {
    int c;
    c = mas[i];
    mas[i] = mas[i - 1];
    mas[i - 1] = c;
}
 
void ShakerSorting(int *mas, int Start, int N, int sleep) {
    int Left, Right, i;
    Left = Start;
    Right = N - 1;
    while (Left <= Right) {
        for (i = Right; i >= Left; i--)
            if (mas[i - 1] > mas[i])
               Swap(mas, i);
            Left++;
        for (i = Left; i <= Right; i++)
            if (mas[i] > mas[i + 1])
               Swap(mas, i);
            Right--;
    }
}
 
    void main() {
            setlocale(LC_ALL, "Russian");
            int sleep;
            printf("Введите скорость выполнения программы в мс: ");
            scanf("%i", &sleep);
            int mas[]{ 45, 2, 34, 21, 24, 12, 0, 69 };
            int G[N] = {};
            for (int i = 0; i < N; i++)
                G[i] = mas[i];
            for (int i = 0; i < N; i++)
                ShakerSorting(mas, 1, N, sleep);
            system("cls");
            printf("Сгенерированный массив: \n");
            for (int i = 0; i < N; i++)
                printf("%d ", G[i]);
            printf("\n\nОтсортированный массив: \n");
            for (int i = 0; i < N; i++)
                printf("%d ", mas[i]);
            printf("\n\nДля продолжения нажмите любую клавишу ...");
            _getch();
}

Решение задачи: «Шейкерная сортировка (переделать графику)»

textual
Листинг программы
const int N = 10;
 
void printArray(int arr[], int size, int begin, int action, int sleep) {
    system("cls");
    printf("Сгенерированный массив: \n");
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    int color;
    if (action == 1) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200;
    }
    else if (action == 2) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200 | FOREGROUND_GREEN | 200;
    }
    else if (action == 3) {
        color = BACKGROUND_GREEN | 200 | BACKGROUND_RED | 200 | BACKGROUND_BLUE | 200 | FOREGROUND_RED | 200;
    }
    for (int i = 0; i < size; i++) {
        if (i == begin || i == begin - 1) {
            SetConsoleTextAttribute(out, color);
            printf_s(" <%d>", arr[i]);
            SetConsoleTextAttribute(out, DEFAULT_PALETTE);
        }
        else {
            printf("%d ", arr[i]);
        }
    }
    Sleep(sleep);
}
 
void shakerSort(int array[], int size, int sleep) {
    for (int i = 0; i < size / 2; i++) {
        bool swapped = false;
        for (int j = i; j < size - i - 1; j++) { 
            printArray(array, N, j + 1, 1, sleep);
            if (array[j] < array[j + 1]) {
                printArray(array, N, j + 1, 3, sleep);
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
                printArray(array, N, j + 1, 2, sleep);
                swapped = true;
            }
        }
        for (int j = size - 2 - i; j > i; j--) { 
            printArray(array, N, j + 1, 1, sleep);
            if (array[j] > array[j - 1]) {
                int tmp = array[j];
                printArray(array, N, j, 3, sleep);
                array[j] = array[j - 1];
                array[j - 1] = tmp;
                printArray(array, N, j, 2, sleep);
                swapped = true;
            }
        }
        if (!swapped) break; 
    }
}
 
void main() {
    setlocale(LC_ALL, "Russian");
    int A[N] = {};
    int sleep;
    printf("Введите скорость выполнения программы в мс: ");
    scanf_s("%i", &sleep);
    srand(time(NULL));
    for (int i = 0; i < N; i++) {
        A[i] = rand() % 2001 - 1000;
    }
    int G[N];
    for (int i = 0; i < 10; i++)
        G[i] = A[i];
 
    shakerSort(A, N, sleep);
    system("cls");
    printf("Сгенерированный массив: \n");
    for (int i = 0; i < N; i++)
        printf("%d ", G[i]);
    printf("\n\nОтсортированный массив: \n");
    for (int i = 0; i < N; i++)
        printf("%d ", A[i]);
    printf("\n\nДля продолжения нажмите любую клавишу ...");
    _getch();
}

Объяснение кода листинга программы

  1. Объявлена константа N равная 10.
  2. Функция printArray() выводит массив на экран, используя функцию printf() и функцию SetConsoleTextAttribute() для установки цвета текста и фона.
  3. Функция shakerSort() реализует алгоритм сортировки Шейкера, который является модификацией алгоритма сортировки вставками. Алгоритм разделяет массив на две части, затем сортирует каждую часть отдельно, затем объединяет их.
  4. В функции main() задается вопрос пользователю о скорости выполнения программы, затем программа генерирует случайный массив A и копирует его в массив G.
  5. Вызывается функция shakerSort() для сортировки массива A.
  6. Выводится отсортированный массив A.
  7. Выводится сообщение Для продолжения нажмите любую клавишу ... и вызывается функция _getch() для приостановки выполнения программы до нажатия клавиши.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы