Ответ на вопрос
Сортировка чёт-нечет
Сортиро́вка чёт-не́чет — относительно простой алгоритм алгоритм сортировки, разработанный для использования на параллельных процессорах, является модификацией пузырьковой сортировки. Суть модификации в том, чтобы сравнивать элементы массива под чётными и нечётными индексами с последующими элементами независимо. Алгоритм был впервые представлен Н. Хаберманом (N. Haberman) в 1972 году.
Общие сведения
Что важно знать
| Чёт-нечётная сортировка | |
|---|---|
| англ. Odd-even sort | |
| Область использования | Сортировка данных, параллельные вычисления |
| Ключевые слова | сортировка сравнением, транспозиционная сортировка, кирпичная сортировка |
| Базовые понятия | сравнение, обмен, чётная фаза, нечётная фаза |
Описание алгоритма
Заводится флаг, определяющий, отсортирован ли массив. В начале итерации ставится в состояние «истина», далее каждый нечётный элемент сверяется с последующим, и, если они стоят в расположены в неправильном порядке (предыдущий больше следующего), элементы меняются местами, и флаг ставится в состояние «ложь». То же самое делается с чётными элементами. Алгоритм не прекращает работу, пока флаг не останется в состоянии «истина».
Реализации на языках программирования
Программная реализация чёт-нечётной сортировки базируется на двух подходах к управлению итерациями:
- Фиксированное число проходов. Количество итераций жёстко ограничивается размером массива (). Данный метод гарантирует упорядочивание данных в худшем случае, упрощает код и анализ временной сложности. Он используется в приведённых реализациях на C++ и JavaScript. В наихудшем и среднем случаях сложность составляет сравнений и перестановок[1].
- Адаптивный проход с флагом оптимизации. Выполнение цикла продолжается до тех пор, пока на очередной итерации (чётной и нечётной) происходит хотя бы один обмен элементов. Наличие флага
sorted(как в примере на PHP) позволяет досрочно завершить алгоритм, если исходный массив изначально упорядочен или близок к этому состоянию. В лучшем случае (для уже отсортированного массива) сложность снижается до [2].
В последовательном режиме сложность подходов различается:
- Фиксированное число проходов (C++/JS) всегда даёт сравнений и перестановок, поскольку число итераций не зависит от начальной упорядоченности данных[3].
- Адаптивный подход с флагом
sorted(PHP) в худшем случае требует операций, а в лучшем (если массив уже отсортирован) — , так как алгоритм завершается после первого же прохода [3].
В параллельной архитектуре при наличии независимых вычислительных узлов алгоритм может быть выполнен за шагов[4]. Более эффективная параллельная версия — сортирующая сеть Батчера (Batcher’s odd-even mergesort) — достигает параллельного времени [2][5].
Реализация на C++
template < typename T, size_t N >
void oddEvenSorting(T (&array)[N]) {
for (size_t i = 0; i < N; i++) {
// (i % 2) ? 0 : 1 возвращает 0, если i нечётное, 1 — если чётное
for (size_t j = (i % 2) ? 0 : 1; j + 1 < N; j += 2) {
if (array[j] > array[j + 1]) {
std::swap(array[j], array[j + 1]);
}
}
}
}
Реализация на JavaScript
function oddEvenSorting(array) {
const arrayLength = array.length; //длина массива
for (let i = 0; i < arrayLength; i++) {
// (i % 2) ? 0 : 1 возвращает 0, если i нечётное, 1 — если чётное
for (let j = (i % 2) ? 0 : 1; j < arrayLength - 1; j += 2) {
if (array[j] > array[j + 1])
[array[j], array[j + 1]] = [array[j + 1], array[j]]; //swap
}
}
return array;
}
Реализация на PHP
function oddEvenSort(array &$arr): void {
$n = count($arr);
$sorted = false;
while (!$sorted) {
$sorted = true;
// Нечётная фаза: сравниваем пары (1,2), (3,4), (5,6), ...
for ($i = 1; $i < $n - 1; $i += 2) {
if ($arr[$i] > $arr[$i + 1]) {
$temp = $arr[$i];
$arr[$i] = $arr[$i + 1];
$arr[$i + 1] = $temp;
$sorted = false;
}
}
// Чётная фаза: сравниваем пары (0,1), (2,3), (4,5), ...
for ($i = 0; $i < $n - 1; $i += 2) {
if ($arr[$i] > $arr[$i + 1]) {
$temp = $arr[$i];
$arr[$i] = $arr[$i + 1];
$arr[$i + 1] = $temp;
$sorted = false;
}
}
}
}
// for ($x = 0; $x < $lengthArray; $x++) {
// if (!$sorted) {
// $sorted = true;
// for ($i = 0; $i < $lengthArray - 1; $i += 2) {
// if ($array[$i] > $array[$i + 1]) {
// FunctionSwapVariables($array[$i], $array[$i + 1]);
// $sorted = false;
// }
// }
// for ($i = 1; $i < $lengthArray - 2; $i += 2) {
// if ($array[$i] > $array[$i + 1]) {
// FunctionSwapVariables($array[$i], $array[$i + 1]);
// $sorted = false;
// }
// }
// } else return 'Массив успешно отсортирован';
// }
}
Примечания
- ↑ Кнут Д. Искусство программирования. Том 3. Сортировка и поиск. — 2-е изд. — М.: Вильямс, 2000. — С. 120–125.
- ↑ 1 2 Algorithms and Applications // San Jose State University
- ↑ 1 2 Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. — 2-е изд. — М.: Вильямс, 2011. — Глава 27 «Сортирующие сети», раздел 27.5 и задача 27-2.
- ↑ Odd-Even Transposition Sort (OETS) // MobyLab. URL: https://mobylab.docs.crescdi.pub.ro/en/docs/parallelAndDistributed/laboratory3/oddEvenTranspositionSort/
- ↑ Parallel algorithms on sequences and strings // Carnegie Mellon University
Литература
- Кнут Д. Искусство программирования. Том 3. Сортировка и поиск. — 2-е изд. — М.: Вильямс, 2000. — 832 с. — ISBN 978-5-8459-0082-1.
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. — 2-е изд. — М.: Вильямс, 2011. — 1296 с. — ISBN 978-5-8459-0857-5. (Глава 27 «Сортирующие сети», раздел 27.5 и задача 27-2.)
- Habermann, N. (1972). Parallel Neighbor Sort (or the Glory of the Induction Principle). CMU Computer Science Report. Technical Report AD-759 248, National Technical Information Service, US Department of Commerce.
- Batcher, K. E. (1968). Sorting networks and their applications. Proceedings of the AFIPS Spring Joint Computer Conference, 32, 307—314.
- Алгоритмы и приложения (конспект лекций) // San Jose State University. (дата обращения: 30.08.2026).
- Odd-Even Transposition Sort (OETS) // MobyLab. (дата обращения: 30.08.2026).
- Parallel algorithms on sequences and strings // Carnegie Mellon University. (дата обращения: 30.08.2026).