TheAlgorithms-Python

Форк
0
82 строки · 1.8 Кб
1
def binary_search(lst, item, start, end):
2
    if start == end:
3
        return start if lst[start] > item else start + 1
4
    if start > end:
5
        return start
6

7
    mid = (start + end) // 2
8
    if lst[mid] < item:
9
        return binary_search(lst, item, mid + 1, end)
10
    elif lst[mid] > item:
11
        return binary_search(lst, item, start, mid - 1)
12
    else:
13
        return mid
14

15

16
def insertion_sort(lst):
17
    length = len(lst)
18

19
    for index in range(1, length):
20
        value = lst[index]
21
        pos = binary_search(lst, value, 0, index - 1)
22
        lst = lst[:pos] + [value] + lst[pos:index] + lst[index + 1 :]
23

24
    return lst
25

26

27
def merge(left, right):
28
    if not left:
29
        return right
30

31
    if not right:
32
        return left
33

34
    if left[0] < right[0]:
35
        return [left[0], *merge(left[1:], right)]
36

37
    return [right[0], *merge(left, right[1:])]
38

39

40
def 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])
49
    True
50
    >>> tim_sort([3, 2, 1]) == sorted([3, 2, 1])
51
    True
52
    """
53
    length = len(lst)
54
    runs, sorted_runs = [], []
55
    new_run = [lst[0]]
56
    sorted_array = []
57
    i = 1
58
    while i < length:
59
        if lst[i] < lst[i - 1]:
60
            runs.append(new_run)
61
            new_run = [lst[i]]
62
        else:
63
            new_run.append(lst[i])
64
        i += 1
65
    runs.append(new_run)
66

67
    for run in runs:
68
        sorted_runs.append(insertion_sort(run))
69
    for run in sorted_runs:
70
        sorted_array = merge(sorted_array, run)
71

72
    return sorted_array
73

74

75
def main():
76
    lst = [5, 9, 10, 3, -4, 5, 178, 92, 46, -18, 0, 7]
77
    sorted_lst = tim_sort(lst)
78
    print(sorted_lst)
79

80

81
if __name__ == "__main__":
82
    main()
83

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.