How it works
Sorting network style.
Implementation
function oddEvenMergeSort(arr, stats) { const n = arr.length; if (n <= 1) return; let t = Math.ceil(Math.log2(n)); let p = Math.pow(2, t - 1); while (p > 0) { let q = Math.pow(2, t - 1); let r = 0; let d = p; while (d > 0) { for (let i = 0; i < n - d; i++) { if ((i & p) === r) { compare(i, i + d); if (arr[i] > arr[i + d]) { [arr[i], arr[i + d]] = [arr[i + d], arr[i]]; swap(i, i + d); } } } d = q - p; q = q / 2; r = p; } p = Math.floor(p / 2); } for (let i = 0; i < n; i++) markSorted(i); }
def oddEvenMergeSort(arr, stats): if (n <= 1): return t = -(-(__import__("math").log2(n) if (n) > 0 else 0) // 1) p = int((2) ** ((t - 1))) while (p > 0): q = int((2) ** ((t - 1))) r = 0 d = p while (d > 0): for i in range((n - d)): if ((i & p) == r): compare(i, (i + d)) if (arr[i] > arr[(i + d)]): arr[i], arr[(i + d)] = arr[(i + d)], arr[i] swap(i, (i + d)) d = (q - p) q = (q // 2) r = p p = (p // 2) for i in range(n): markSorted(i)
#include <vector> #include <algorithm> #include <cmath> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { if((n <= 1)) { return; } int t = (int)std::ceil((int)std::log2(n)); int p = (int)std::pow(2, (t - 1)); while((p > 0)) { int q = (int)std::pow(2, (t - 1)); int r = 0; int d = p; while((d > 0)) { for(int i=0; i<(n - d); i++) { if(((i & p) == r)) { compare(i, (i + d)); if((arr[i] > arr[(i + d)])) { std::swap(arr[i], arr[(i + d)]); swap(i, (i + d)); } } } d = (q - p); q = (q / 2); r = p; } p = (p / 2); } for(int i=0; i<n; i++) { markSorted(i); } }
public void Sort(int[] arr, int n, dynamic stats) { if((n <= 1)) { return; } int t = (int)Math.Ceiling((int)Math.Log((double)n, 2)); int p = (int)Math.Pow(2, (t - 1)); while((p > 0)) { int q = (int)Math.Pow(2, (t - 1)); int r = 0; int d = p; while((d > 0)) { for(int i=0; i<(n - d); i++) { if(((i & p) == r)) { compare(i, (i + d)); if((arr[i] > arr[(i + d)])) { { int _t = arr[i]; arr[i] = arr[(i + d)]; arr[(i + d)] = _t; } swap(i, (i + d)); } } } d = (q - p); q = (q / 2); r = p; } p = (p / 2); } for(int i=0; i<n; i++) { markSorted(i); } }
#include <stdio.h> #include <math.h> void sort(int arr[], int n, int* comparisons, int* swaps) { if((n <= 1)) { return; } int t = (int)ceil((int)log2(n)); int p = (int)pow(2, (t - 1)); while((p > 0)) { int q = (int)pow(2, (t - 1)); int r = 0; int d = p; while((d > 0)) { for(int i=0; i<(n - d); i++) { if(((i & p) == r)) { compare(i, (i + d)); if((arr[i] > arr[(i + d)])) { { int _t = arr[i]; arr[i] = arr[(i + d)]; arr[(i + d)] = _t; } swap(i, (i + d)); } } } d = (q - p); q = (q / 2); r = p; } p = (p / 2); } for(int i=0; i<n; i++) { markSorted(i); } }