Шейкерная сортировка (переделать графику) - 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(); }
Объяснение кода листинга программы
- Объявлена константа N равная 10.
- Функция printArray() выводит массив на экран, используя функцию printf() и функцию SetConsoleTextAttribute() для установки цвета текста и фона.
- Функция shakerSort() реализует алгоритм сортировки Шейкера, который является модификацией алгоритма сортировки вставками. Алгоритм разделяет массив на две части, затем сортирует каждую часть отдельно, затем объединяет их.
- В функции main() задается вопрос пользователю о скорости выполнения программы, затем программа генерирует случайный массив A и копирует его в массив G.
- Вызывается функция shakerSort() для сортировки массива A.
- Выводится отсортированный массив A.
- Выводится сообщение
Для продолжения нажмите любую клавишу ...
и вызывается функция _getch() для приостановки выполнения программы до нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д