#include
#include
#include
#include
using namespace std;
void shaker(int X[], int size)
{
int left = 0, right = size - 1, yes = 1;
while ((left < right) && yes > 0)
{
yes = 0;
for (int i = left; i < right; i++)
if (X[i] > X[i + 1])
{
swap(X[i], X[i + 1]);
yes = 1;
}
right--;
for (int i = right; i > left; i--)
if (X[i - 1] > X[i])
{
swap(X[i], X[i - 1]);
yes = 1;
}
left++;
}
}
void print(string s, int X [], int size)
{
int i, j = 0;
cout
C/C++
Шейкерная сортировка получила своё название благодаря тому, что при работе алгоритма элементы "встряхиваются" в массиве, как если бы вы трясли шейкер. Функция сначала проходит по массиву слева направо и обменивает местами пары соседних элементов, если они стоят в неправильном порядке. Затем она делает то же самое, но уже в обратном направлении - справа налево. Этот процесс продолжается до тех пор, пока массив не будет отсортирован.
С++ Нужен пример функции Шейкерной сортировки для новичка
Хоть для новичка, хоть для продвинутого - вот пример с упорядочением динамического массива длины n со случайными элементами из диапазона [a;b] по возрастанию:
Количество циклов можно уменьшить - если просто менять направление на каждом проходе.
void shacker_sort(int arr[], int size) {
int pos[2] = {-1, size - 1};
bool flg = true;
for (int dlt = 1, n = 1; flg && --size > 0; n = 1 - n, dlt = -dlt) {
flg = false;
for (int i = pos[1 - n] + dlt; i != pos[n]; i += dlt) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
flg = true;
}
}
pos[n] -= dlt;
}
}
void shakerSort(int arr[], int n)
{
bool swapped = true;
int start = 0;
int end = n - 1;
while (swapped) {
swapped = false;
// Проход слева направо, как в пузырьковой сортировке
for (int i = start; i < end; ++i) {
if (arr[i] > arr[i + 1]) {
std::swap(arr[i], arr[i + 1]);
swapped = true;
}
}
// Если не было обменов, то массив отсортирован
if (!swapped)
break;
swapped = false;
// Проход справа налево
--end;
for (int i = end - 1; i >= start; --i) {
if (arr[i] > arr[i + 1]) {
std::swap(arr[i], arr[i + 1]);
swapped = true;
}
}
// Увеличиваем начальный индекс для следующей итерации
++start;
}
}
Эта функция принимает массив целых чисел arr длины n в качестве аргументов и сортирует его по возрастанию. Она реализует шейкерную сортировку, которая представляет собой улучшенную версию пузырьковой сортировки. Шейкерная сортировка получила своё название благодаря тому, что при работе алгоритма элементы "встряхиваются" в массиве, как если бы вы трясли шейкер. Функция сначала проходит по массиву слева направо и обменивает местами пары соседних элементов, если они стоят в неправильном порядке. Затем она делает то же самое, но уже в обратном направлении - справа налево. Этот процесс продолжается до тех пор, пока массив не будет отсортирован.
Похожие вопросы
- Срочно нужен пример технологии КЛИЕНТ-СЕРВЕР на чистом Си с применением IPv6
- FreeConsole() с++ обясните зачем нужна эта функция в интеренете не понял обьяснение видео тоже не нашол нигде про нее
- Сравнение скорости сортировки выбором и сортировки слиянием (SelectionSort vs MergeSort)
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Задача на сортировку структур. Язык C++.
- Проблемы с сортировкой массива методом пузырька.
- КОНТРОЛЬНЫЕ ЗАДАНИЯ ПО СОРТИРОВКЕ МАССИВОВ
- С++ Сортировка массива
- Алгоритмы STL, sort, первичный и вторичный ключи для сортировки.