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; } } } } }