programming-challenges/LEXISORT/LEXISORT-MERGE.py
2025-02-06 12:17:03 -06:00

70 lines
1.2 KiB
Python

def merge(l: list, start: int, end: int, end2: int) -> None:
n1 = end - start + 1
n2 = end2 - end
left = [0] * (n1)
right = [0] * (n2)
for i in range(n1):
left[i] = l[start + i]
for i in range(n2):
right[i] = l[end + 1 + i]
i = 0
j = 0
k = start
while i < n1 and j < n2:
if left[i] <= right[j]:
l[k] = left[i]
i += 1
else:
l[k] = right[j]
j += 1
k += 1
while i < n1:
l[k] = left[i]
j += 1
k += 1
while j < n2:
l[k] = right[j]
j += 1
k += 1
def merge_sort(l: list, left: int, right: int) -> None:
if left < right:
m = left + (right - 1) // 2
merge_sort(l, left, m)
merge_sort(l, m + 1, right)
merge(l, left, m, right)
def main():
lines: list[str] = []
test_cases = int(input())
while (test_cases != 0):
n = int(input())
while (n != 0):
lines.append(input())
n -= 1
merge_sort(lines, 0, len(lines) - 1)
for line in lines:
print(line)
lines = []
test_cases -= 1
if __name__ == "__main__":
main()