-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathphoenix_sort.py
More file actions
60 lines (47 loc) · 1.49 KB
/
phoenix_sort.py
File metadata and controls
60 lines (47 loc) · 1.49 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
import bisect
import time
def phoenix_sort_optimized(data):
result = []
leftovers = data[:]
history = []
while leftovers:
run = [leftovers[0]]
next_leftovers = []
for i in range(1, len(leftovers)):
if leftovers[i] >= run[-1]:
run.append(leftovers[i])
else:
next_leftovers.append(leftovers[i])
result = merge_sorted(result, run)
leftovers = smart_reinsert(next_leftovers, result)
history.append(result[:])
return result, history
def merge_sorted(list1, list2):
"""Merge two sorted lists into one sorted list."""
merged = []
i = j = 0
while i < len(list1) and j < len(list2):
if list1[i] <= list2[j]:
merged.append(list1[i])
i += 1
else:
merged.append(list2[j])
j += 1
merged.extend(list1[i:])
merged.extend(list2[j:])
return merged
def smart_reinsert(leftovers, sorted_part):
"""Use binary insertion to smartly reintegrate rejected items."""
new_leftovers = []
for item in leftovers:
idx = bisect.bisect_right(sorted_part, item)
sorted_part.insert(idx, item)
return new_leftovers
if __name__ == '__main__':
data = [5, 1, 4, 2, 6, 0, 7]
start = time.time()
sorted_data, steps = phoenix_sort_optimized(data)
end = time.time()
print("Original:", data)
print("Sorted:", sorted_data)
print(f"Phoenix Sort took {end - start:.6f} seconds")