#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;
}
Комментариев нет:
Отправить комментарий