Нечетно-четная сортировка - Odd–even sort

Нечетно-четная сортировка
Пример нечетно-четной перестановки сортировки списка случайных чисел.
Пример нечетно-четной перестановки сортировки списка случайных чисел.
КлассАлгоритм сортировки
Структура данныхМассив
Худший случай спектакль
Лучший случай спектакль
Худший случай космическая сложность

В вычислениях нечетная – четная сортировка или нечетно-четная перестановка (также известен как кирпич сортировать[1][самостоятельно опубликованный источник ] или сортировка по четности) является относительно простым алгоритм сортировки изначально разрабатывался для использования на параллельных процессорах с локальными соединениями. Это сортировка сравнения относится к пузырьковая сортировка, с которым он имеет много общих характеристик. Он работает, сравнивая все нечетные / четные индексированные пары смежных элементов в списке, и, если пара находится в неправильном порядке (первая больше, чем вторая), элементы меняются местами. На следующем шаге это повторяется для пар четных / нечетных индексов (соседних элементов). Затем он чередует нечетные / четные и четные / нечетные шаги, пока список не будет отсортирован.

Сортировка по массивам процессоров

На параллельных процессорах, с одним значением на процессор и только локальными соединениями между левым и правым соседями, все процессоры одновременно выполняют операцию сравнения-обмена со своими соседями, чередуя пары нечетно-четный и четно-нечетный. Этот алгоритм был первоначально представлен и показал свою эффективность на таких процессорах Хаберманом в 1972 году.[2]

Алгоритм эффективно распространяется на случай нескольких элементов на процессор. В алгоритме разделения слиянием нечетных и четных Боде – Стивенсона каждый процессор сортирует свой собственный подсписок на каждом шаге, используя любой эффективный алгоритм сортировки, а затем выполняет операцию разделения слияния или транспонирования-слияния со своим соседом, при этом соседние пары чередуются. между нечетно-четным и четно-нечетным на каждом шаге.[3]

Сортировка нечетных и четных слиянием Батчера

Связанный, но более эффективный алгоритм сортировки - это Сортировка по четным и нечетным дозаторам, используя операции сравнения-обмена и операции перетасовки.[4]Метод Батчера эффективен на параллельных процессорах с соединениями на большие расстояния.[5]

Алгоритм

Однопроцессорный алгоритм, например пузырьковая сортировка, это просто, но не очень эффективно. Здесь с нуля предполагается индекс:

функция oddEvenSort(список) {  функция своп(список, я, j) {    вар темп = список[я];    список[я] = список[j];    список[j] = темп;  }  вар отсортированный = ложный;  в то время как (!отсортированный) {    отсортированный = правда;    для (вар я = 1; я < список.длина - 1; я += 2) {      если (список[я] > список[я + 1]) {        своп(список, я, я + 1);        отсортированный = ложный;      }    }    для (вар я = 0; я < список.длина - 1; я += 2) {      если (список[я] > список[я + 1]) {        своп(список, я, я + 1);        отсортированный = ложный;      }    }  }}

Доказательство правильности

Заявление: Пусть быть последовательностью данных, упорядоченной <. Алгоритм нечетно-четной сортировки правильно сортирует эти данные в проходит. (Под проходом здесь подразумевается полная последовательность нечетно-четных или четно-нечетных сравнений. Проходы выполняются в следующем порядке: проход 1: чет-нечет, проход 2: чет-нечет и т. Д.)

Доказательство:

Это доказательство частично основано на доказательстве Томаса Уорша.[6]

Поскольку алгоритм сортировки включает только операции сравнения-обмена и не принимает во внимание (порядок операций сравнения-обмена не зависит от данных), согласно принципу сортировки Кнута 0–1,[7][8] достаточно проверить правильность, когда каждый равно 0 или 1. Предположим, что есть 1с.

Обратите внимание, что крайняя правая единица может быть как в четной, так и в нечетной позиции, поэтому она не может быть перемещена при первом нечетно-четном проходе. Но после первого нечетно-четного паса крайняя правая 1 будет в четной позиции. Отсюда следует, что он будет перемещен вправо всеми оставшимися проходами. Так как крайний правый начинается в позиции больше или равной , его нужно переместить самое большее шаги. Отсюда следует, что требуется не более проходит, чтобы переместить крайнюю правую единицу в правильное положение.

Теперь рассмотрим вторую крайнюю правую цифру 1. После двух проходов цифра 1 справа сдвинется вправо как минимум на один шаг. Отсюда следует, что для всех оставшихся проходов мы можем рассматривать вторую крайнюю правую 1 как крайнюю правую 1. Вторая крайняя правая 1 начинается с позиции по крайней мере и должен быть перемещен в позицию не более , поэтому его нужно переместить не более шаги. После максимум 2 проходов крайний правый 1 уже будет перемещен, поэтому запись справа от второго крайнего правого 1 будет 0. Следовательно, для всех проходов после первых двух, второй крайний правый 1 будет перемещаться вправо. Таким образом, требуется не более проходит, чтобы переместить вторую крайнюю правую единицу в правильное положение.

Продолжая таким образом, по индукции можно показать, что -й крайний правый 1 перемещается в правильное положение не более чем в проходит. поскольку , следует, что -й крайний правый 1 перемещается в правильное положение не более чем в проходит. Таким образом, список правильно отсортирован по проходит. QED.

Отметим, что каждый проход занимает шагов, поэтому этот алгоритм сложность.

использованная литература

  1. ^ Филлипс, Малькольм. «Сортировка массива». Homepages.ihug.co.nz. Архивировано из оригинал 28 октября 2011 г.. Получено 3 августа 2011.
  2. ^ Н. Хаберман (1972) «Сортировка по параллельному соседу (или слава принципа индукции)», Отчет CMU по информатике (доступен как технический отчет AD-759 248, Национальная служба технической информации, Министерство торговли США, 5285 Port Royal Rd Springfield VA 22151).
  3. ^ Lakshmivarahan, S .; Дхалл, С. К. и Миллер, Л. Л. (1984), Альт, Франц Л. и Йовитс, Маршалл К. (ред.), «Алгоритмы параллельной сортировки», Достижения в компьютерах, Academic Press, 23: 295–351, ISBN  978-0-12-012123-6
  4. ^ Седжвик, Роберт (2003). Алгоритмы на Java, части 1-4 (3-е изд.). Эддисон-Уэсли Профессионал. С. 454–464. ISBN  978-0-201-36120-9.
  5. ^ Кент, Аллен; Уильямс, Джеймс Г. (1993). Энциклопедия компьютерных наук и технологий: Приложение 14. CRC Press. С. 33–38. ISBN  978-0-8247-2282-1.
  6. ^ «Пять лекций по ЦА» (PDF). Liinwww.ira.uka.de. Получено 2017-07-30.
  7. ^ Ланг, Ханс Вернер. «Принцип 0-1». Iti.fh-flensburg.de. Получено 30 июля 2017.
  8. ^ «Распределенная сортировка» (PDF). Net.t-labs.tu-berlin.de. Получено 2017-07-30.