algoalgo-world
algoalgo-world/sort2d/bitonic-2d-sort
sort2d/bitonic-2d-sort

바이토닉 2D

최선
O(n log^2 n)
평균
O(n log^2 n)
최악
O(n log^2 n)
공간
O(1)
안정성
불안정
방식
정렬 네트워크

n 은 격자의 칸 수

언어를 고르면 코드가 열린다

def bitonic_2d_sort(grid):
    n = len(grid)
    padded = 1
    while padded < n:
        padded *= 2
    block = 2
    while block <= padded:
        span = block // 2
        flip = True
        while span > 0:
            mask = block - 1
            for i in range(n):
                if flip:
                    partner = (i & ~mask) + mask - (i & mask)
                else:
                    partner = i ^ span
                if i < partner < n and grid[i] > grid[partner]:
                    grid[i], grid[partner] = grid[partner], grid[i]
            span //= 2
            flip = False
        block *= 2
function bitonic2dSort(grid) {
  const n = grid.length;
  let padded = 1;
  while (padded < n) padded *= 2;
  for (let block = 2; block <= padded; block *= 2) {
    for (let span = block >> 1; span > 0; span >>= 1) {
      const flip = span === block >> 1;
      const mask = block - 1;
      for (let i = 0; i < n; i++) {
        const partner = flip ? (i & ~mask) + mask - (i & mask) : i ^ span;
        if (partner > i && partner < n && grid[i] > grid[partner]) {
          [grid[i], grid[partner]] = [grid[partner], grid[i]];
        }
      }
    }
  }
}
void bitonic_2d_sort(int grid[], int n) {
    int padded = 1;
    while (padded < n) padded *= 2;
    for (int block = 2; block <= padded; block *= 2) {
        for (int span = block / 2; span > 0; span /= 2) {
            int flip = span == block / 2;
            int mask = block - 1;
            for (int i = 0; i < n; i++) {
                int partner = flip ? (i & ~mask) + mask - (i & mask)
                                   : i ^ span;
                if (partner > i && partner < n && grid[i] > grid[partner]) {
                    int t = grid[i];
                    grid[i] = grid[partner];
                    grid[partner] = t;
                }
            }
        }
    }
}
void bitonic_2d_sort(std::vector<int>& grid) {
    int n = static_cast<int>(grid.size());
    int padded = 1;
    while (padded < n) padded *= 2;
    for (int block = 2; block <= padded; block *= 2) {
        for (int span = block / 2; span > 0; span /= 2) {
            bool flip = span == block / 2;
            int mask = block - 1;
            for (int i = 0; i < n; i++) {
                int partner = flip ? (i & ~mask) + mask - (i & mask)
                                   : i ^ span;
                if (partner > i && partner < n && grid[i] > grid[partner]) {
                    std::swap(grid[i], grid[partner]);
                }
            }
        }
    }
}
static void Bitonic2dSort(int[] grid) {
    int n = grid.Length;
    int padded = 1;
    while (padded < n) padded *= 2;
    for (int block = 2; block <= padded; block *= 2) {
        for (int span = block / 2; span > 0; span /= 2) {
            bool flip = span == block / 2;
            int mask = block - 1;
            for (int i = 0; i < n; i++) {
                int partner = flip ? (i & ~mask) + mask - (i & mask)
                                   : i ^ span;
                if (partner > i && partner < n && grid[i] > grid[partner]) {
                    (grid[i], grid[partner]) = (grid[partner], grid[i]);
                }
            }
        }
    }
}
static void bitonic2dSort(int[] grid) {
    int n = grid.length;
    int padded = 1;
    while (padded < n) padded *= 2;
    for (int block = 2; block <= padded; block *= 2) {
        for (int span = block / 2; span > 0; span /= 2) {
            boolean flip = span == block / 2;
            int mask = block - 1;
            for (int i = 0; i < n; i++) {
                int partner = flip ? (i & ~mask) + mask - (i & mask)
                                   : i ^ span;
                if (partner > i && partner < n && grid[i] > grid[partner]) {
                    int t = grid[i];
                    grid[i] = grid[partner];
                    grid[partner] = t;
                }
            }
        }
    }
}
돌려 보고 코드도 본다