Skip to content

Odd Even Merge Sort

Sorting network algorithm that recursively merges sorted sequences using odd even comparisons.

Odd even merge sort is a comparison sorting algorithm designed as a sorting network. It uses a fixed pattern of compare and swap operations, independent of the input values.

It is closely related to bitonic sort but uses a different merging strategy. It is especially useful in parallel hardware and SIMD execution environments.

Problem

Given an array AA of length nn, reorder it such that:

A[0]A[1]A[n1] A[0] \le A[1] \le \dots \le A[n-1]

The algorithm is simplest when nn is a power of two.

Idea

The algorithm consists of:

steppurpose
recursive sortsort halves independently
odd even mergemerge sorted halves using structured comparisons

The merge step works by separating elements into odd and even indexed subsequences and merging them recursively.

Algorithm

odd_even_merge_sort(A, lo, n):
    if n <= 1:
        return

    k = n / 2

    odd_even_merge_sort(A, lo, k)
    odd_even_merge_sort(A, lo + k, k)

    odd_even_merge(A, lo, n, 1)
odd_even_merge(A, lo, n, step):
    if step < n:
        odd_even_merge(A, lo, n, step * 2)
        odd_even_merge(A, lo + step, n, step * 2)

        for i from lo + step to lo + n - step - 1 step 2*step:
            compare_and_swap(A, i, i + step)

Example

Let:

A=[5,3,8,1,7,2,6,4] A = [5, 3, 8, 1, 7, 2, 6, 4]

Recursive sorting produces two sorted halves:

  • [1, 3, 5, 8]
  • [2, 4, 6, 7]

Odd even merge performs structured comparisons:

  • compare adjacent elements across halves
  • refine order through recursive merging

Final result:

[1,2,3,4,5,6,7,8] [1, 2, 3, 4, 5, 6, 7, 8]

Correctness

The recursive sorting ensures both halves are sorted. The odd even merge step interleaves comparisons between elements at specific positions. These comparisons gradually enforce the correct ordering constraints across the entire sequence. By recursion on step size, all inversions are eliminated, resulting in a sorted sequence.

Complexity

metricvalue
time sequentialO(nlog2n)O(n \log^2 n)
parallel depthO(log2n)O(\log^2 n)
comparisonsfixed pattern

Properties

propertyvalue
stableno
in-placeyes
data independentyes
parallel friendlyyes
hardware suitabilityhigh

Notes

Odd even merge sort is used in sorting networks where predictable execution is required. It avoids data dependent branching, which is important for parallel processors and GPUs.

Although slower than O(nlogn)O(n \log n) algorithms in sequential settings, it performs well when executed in parallel.

Implementation

def odd_even_merge_sort(a):
    def compare_and_swap(i, j):
        if a[i] > a[j]:
            a[i], a[j] = a[j], a[i]

    def merge(lo, n, step):
        if step < n:
            merge(lo, n, step * 2)
            merge(lo + step, n, step * 2)

            for i in range(lo + step, lo + n - step, 2 * step):
                compare_and_swap(i, i + step)

    def sort(lo, n):
        if n <= 1:
            return

        k = n // 2
        sort(lo, k)
        sort(lo + k, k)
        merge(lo, n, 1)

    sort(0, len(a))
    return a
func OddEvenMergeSort(a []int) {
	var compareAndSwap func(int, int)
	compareAndSwap = func(i, j int) {
		if a[i] > a[j] {
			a[i], a[j] = a[j], a[i]
		}
	}

	var merge func(int, int, int)
	merge = func(lo, n, step int) {
		if step < n {
			merge(lo, n, step*2)
			merge(lo+step, n, step*2)

			for i := lo + step; i < lo+n-step; i += 2 * step {
				compareAndSwap(i, i+step)
			}
		}
	}

	var sort func(int, int)
	sort = func(lo, n int) {
		if n <= 1 {
			return
		}

		k := n / 2
		sort(lo, k)
		sort(lo+k, k)
		merge(lo, n, 1)
	}

	sort(0, len(a))
}