TheAlgorithms-Python
93 строки · 2.5 Кб
1"""
2Implementation of iterative merge sort in Python
3Author: Aman Gupta
4
5For doctests run following command:
6python3 -m doctest -v iterative_merge_sort.py
7
8For manual testing run:
9python3 iterative_merge_sort.py
10"""
11
12from __future__ import annotations
13
14
15def merge(input_list: list, low: int, mid: int, high: int) -> list:
16"""
17sorting left-half and right-half individually
18then merging them into result
19"""
20result = []
21left, right = input_list[low:mid], input_list[mid : high + 1]
22while left and right:
23result.append((left if left[0] <= right[0] else right).pop(0))
24input_list[low : high + 1] = result + left + right
25return input_list
26
27
28# iteration over the unsorted list
29def iter_merge_sort(input_list: list) -> list:
30"""
31Return a sorted copy of the input list
32
33>>> iter_merge_sort([5, 9, 8, 7, 1, 2, 7])
34[1, 2, 5, 7, 7, 8, 9]
35>>> iter_merge_sort([1])
36[1]
37>>> iter_merge_sort([2, 1])
38[1, 2]
39>>> iter_merge_sort([2, 1, 3])
40[1, 2, 3]
41>>> iter_merge_sort([4, 3, 2, 1])
42[1, 2, 3, 4]
43>>> iter_merge_sort([5, 4, 3, 2, 1])
44[1, 2, 3, 4, 5]
45>>> iter_merge_sort(['c', 'b', 'a'])
46['a', 'b', 'c']
47>>> iter_merge_sort([0.3, 0.2, 0.1])
48[0.1, 0.2, 0.3]
49>>> iter_merge_sort(['dep', 'dang', 'trai'])
50['dang', 'dep', 'trai']
51>>> iter_merge_sort([6])
52[6]
53>>> iter_merge_sort([])
54[]
55>>> iter_merge_sort([-2, -9, -1, -4])
56[-9, -4, -2, -1]
57>>> iter_merge_sort([1.1, 1, 0.0, -1, -1.1])
58[-1.1, -1, 0.0, 1, 1.1]
59>>> iter_merge_sort(['c', 'b', 'a'])
60['a', 'b', 'c']
61>>> iter_merge_sort('cba')
62['a', 'b', 'c']
63"""
64if len(input_list) <= 1:
65return input_list
66input_list = list(input_list)
67
68# iteration for two-way merging
69p = 2
70while p <= len(input_list):
71# getting low, high and middle value for merge-sort of single list
72for i in range(0, len(input_list), p):
73low = i
74high = i + p - 1
75mid = (low + high + 1) // 2
76input_list = merge(input_list, low, mid, high)
77# final merge of last two parts
78if p * 2 >= len(input_list):
79mid = i
80input_list = merge(input_list, 0, mid, len(input_list) - 1)
81break
82p *= 2
83
84return input_list
85
86
87if __name__ == "__main__":
88user_input = input("Enter numbers separated by a comma:\n").strip()
89if user_input == "":
90unsorted = []
91else:
92unsorted = [int(item.strip()) for item in user_input.split(",")]
93print(iter_merge_sort(unsorted))
94