-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcolumn_sort.py
More file actions
80 lines (69 loc) · 2.54 KB
/
column_sort.py
File metadata and controls
80 lines (69 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import math
from multiprocessing import Pool
from recursive_bitonic_sort import bitonic_sort
def sort_columns(columns):
# sorted_columns = []
# with Pool(len(columns)) as p:
# sorted_columns = p.map(bitonic_sort, columns)
# for i in range(len(columns)):
# columns[i] = sorted_columns[i]
for column in columns:
bitonic_sort(column)
def vector_to_columns_row_major(vector, r, c):
return [[vector[j * c + i] for j in range(r)] for i in range(c)]
def vector_to_columns_column_major(vector, r, c):
return [[vector[i * r + j] for j in range(r)] for i in range(c)]
def columns_to_vector_row_major(columns):
r = len(columns)
c = len(columns[0])
return [columns[i][j] for j in range(c) for i in range(r)]
def columns_to_vector_column_major(columns):
return [element for column in columns for element in column]
def transpose(columns):
return vector_to_columns_row_major(columns_to_vector_column_major(columns), len(columns[0]), len(columns))
def untranspose(columns):
return vector_to_columns_column_major(columns_to_vector_row_major(columns), len(columns[0]), len(columns))
def shift(columns):
vector = [-math.inf for _ in range(math.floor(len(columns[0]) / 2))]
vector += columns_to_vector_column_major(columns)
vector += [math.inf for _ in range(math.ceil(len(columns[0]) / 2))]
return vector_to_columns_column_major(vector, len(columns[0]), len(columns) + 1)
def unshift(columns):
vector = columns_to_vector_column_major(columns)
vector = [element for element in vector if element != -math.inf and element != math.inf]
return vector_to_columns_column_major(vector, len(columns[0]), len(columns) - 1)
def sort(a, r, c):
# assume len(a) == r * c and r % c == 0 and r >= 2 * (c - 1) ** 2
columns = vector_to_columns_column_major(a, r, c)
sort_columns(columns)
columns = transpose(columns)
sort_columns(columns)
columns = untranspose(columns)
sort_columns(columns)
columns = shift(columns)
sort_columns(columns)
columns = unshift(columns)
s = columns_to_vector_column_major(columns)
for i in range(r * c):
a[i] = s[i]
def column_sort(a):
n = len(a)
c = 4
if n < 18 * 4:
c = 3
elif n < 8 * 3:
c = 2
elif n < 4:
a.sort()
return
r = math.floor(n / c)
tail = []
for _ in range(r * c, n):
max_element = max(a)
a.remove(max_element)
tail.append(max_element)
tail.reverse()
sort(a, r, c)
for element in tail:
a.append(element)
return a