TheAlgorithms-Python
82 строки · 1.8 Кб
1def binary_search(lst, item, start, end):
2if start == end:
3return start if lst[start] > item else start + 1
4if start > end:
5return start
6
7mid = (start + end) // 2
8if lst[mid] < item:
9return binary_search(lst, item, mid + 1, end)
10elif lst[mid] > item:
11return binary_search(lst, item, start, mid - 1)
12else:
13return mid
14
15
16def insertion_sort(lst):
17length = len(lst)
18
19for index in range(1, length):
20value = lst[index]
21pos = binary_search(lst, value, 0, index - 1)
22lst = lst[:pos] + [value] + lst[pos:index] + lst[index + 1 :]
23
24return lst
25
26
27def merge(left, right):
28if not left:
29return right
30
31if not right:
32return left
33
34if left[0] < right[0]:
35return [left[0], *merge(left[1:], right)]
36
37return [right[0], *merge(left, right[1:])]
38
39
40def tim_sort(lst):
41"""
42>>> tim_sort("Python")
43['P', 'h', 'n', 'o', 't', 'y']
44>>> tim_sort((1.1, 1, 0, -1, -1.1))
45[-1.1, -1, 0, 1, 1.1]
46>>> tim_sort(list(reversed(list(range(7)))))
47[0, 1, 2, 3, 4, 5, 6]
48>>> tim_sort([3, 2, 1]) == insertion_sort([3, 2, 1])
49True
50>>> tim_sort([3, 2, 1]) == sorted([3, 2, 1])
51True
52"""
53length = len(lst)
54runs, sorted_runs = [], []
55new_run = [lst[0]]
56sorted_array = []
57i = 1
58while i < length:
59if lst[i] < lst[i - 1]:
60runs.append(new_run)
61new_run = [lst[i]]
62else:
63new_run.append(lst[i])
64i += 1
65runs.append(new_run)
66
67for run in runs:
68sorted_runs.append(insertion_sort(run))
69for run in sorted_runs:
70sorted_array = merge(sorted_array, run)
71
72return sorted_array
73
74
75def main():
76lst = [5, 9, 10, 3, -4, 5, 178, 92, 46, -18, 0, 7]
77sorted_lst = tim_sort(lst)
78print(sorted_lst)
79
80
81if __name__ == "__main__":
82main()
83