Skip to content

Commit d76b385

Browse files
committed
Improve the existing TimSort implementation
1 parent e3a5b39 commit d76b385

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

sorts/tim_sort.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from typing import List, TypeVar
1+
from typing import TypeVar
22

33
T = TypeVar("T")
44

55

6-
def binary_search(arr: List[T], item: T, left: int, right: int) -> int:
6+
def binary_search(arr: list[T], item: T, left: int, right: int) -> int:
77
"""
88
Return the index where `item` should be inserted in `arr[left:right+1]`
99
to keep it sorted.
@@ -26,7 +26,7 @@ def binary_search(arr: List[T], item: T, left: int, right: int) -> int:
2626
return left
2727

2828

29-
def insertion_sort(arr: List[T]) -> List[T]:
29+
def insertion_sort(arr: list[T]) -> list[T]:
3030
"""
3131
Sort the list in-place using binary insertion sort.
3232
@@ -36,18 +36,18 @@ def insertion_sort(arr: List[T]) -> List[T]:
3636
for i in range(1, len(arr)):
3737
key = arr[i]
3838
j = binary_search(arr, key, 0, i - 1)
39-
arr[:] = arr[:j] + [key] + arr[j:i] + arr[i + 1 :]
39+
arr[:] = [*arr[:j], key, *arr[j:i], *arr[i + 1 :]]
4040
return arr
4141

4242

43-
def merge(left: List[T], right: List[T]) -> List[T]:
43+
def merge(left: list[T], right: list[T]) -> list[T]:
4444
"""
4545
Merge two sorted lists into one sorted list.
4646
4747
>>> merge([1, 3, 5], [2, 4, 6])
4848
[1, 2, 3, 4, 5, 6]
4949
"""
50-
merged = []
50+
merged: list[T] = []
5151
i = j = 0
5252
while i < len(left) and j < len(right):
5353
if left[i] <= right[j]:
@@ -61,7 +61,7 @@ def merge(left: List[T], right: List[T]) -> List[T]:
6161
return merged
6262

6363

64-
def tim_sort(arr: List[T]) -> List[T]:
64+
def tim_sort(arr: list[T]) -> list[T]:
6565
"""
6666
Simplified version of TimSort for educational purposes.
6767
@@ -91,14 +91,14 @@ def tim_sort(arr: List[T]) -> List[T]:
9191
if n == 1:
9292
return arr.copy()
9393

94-
runs = []
94+
runs: list[list[T]] = []
9595
for start in range(0, n, min_run):
9696
end = min(start + min_run, n)
9797
run = insertion_sort(arr[start:end])
9898
runs.append(run)
9999

100100
while len(runs) > 1:
101-
new_runs = []
101+
new_runs: list[list[T]] = []
102102
for i in range(0, len(runs), 2):
103103
if i + 1 < len(runs):
104104
new_runs.append(merge(runs[i], runs[i + 1]))

0 commit comments

Comments
 (0)