Шейкерная сортировка (переделать графику) - 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() для приостановки выполнения программы до нажатия клавиши.