суббота, 27 июня 2026 г.

Шейкер сорт

 #include <stdio.h>

#include <stdbool.h>


void shakerSortDescending(int arr[], int size) {

    bool swapped = true;

    int start = 0;

    int end = size - 1;


    while (swapped) {

        // Сбрасываем флаг перед началом прохода в обе стороны

        swapped = false;


        // 1. Проход СЛЕВА НАПРАВО (выталкиваем минимум в конец)

        for (int i = start; i < end; i++) {

            // Для сортировки по убыванию: если текущий меньше следующего

            if (arr[i] < arr[i + 1]) {

                int temp = arr[i];

                arr[i] = arr[i + 1];

                arr[i + 1] = temp;

                swapped = true;

            }

        }


        // Если перестановки не произошли, массив отсортирован

        if (!swapped) {

            break;

        }


        // Уменьшаем правую границу, так как там уже минимальный элемент

        end--;


        // Сбрасываем флаг для обратного пути

        swapped = false;


        // 2. Проход СПРАВА НАЛЕВО (выталкиваем максимум в начало)

        for (int i = end - 1; i >= start; i--) {

            // Если текущий меньше следующего

            if (arr[i] < arr[i + 1]) {

                int temp = arr[i];

                arr[i] = arr[i + 1];

                arr[i + 1] = temp;

                swapped = true;

            }

        }


        // Увеличиваем левую границу, так как там уже максимальный элемент

        start++;

    }

}


int main() {

    int arr[] = {15, 3, 40, 22, 100, 1, 67};

    int size = sizeof(arr) / sizeof(arr[0]);


    printf("Исходный массив: ");

    for (int i = 0; i < size; i++) printf("%d ", arr[i]);

    printf("\n");


    // Вызов шейкерной сортировки по убыванию

    shakerSortDescending(arr, size);


    printf("По убыванию:     ");

    for (int i = 0; i < size; i++) printf("%d ", arr[i]);

    printf("\n");


    return 0;

}


Комментариев нет:

Отправить комментарий