Skip to content

Commit 84d9757

Browse files
committed
Merge sort.
1 parent 7c577c3 commit 84d9757

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

algorithms/list.py

+45
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,48 @@ def find_max_sub(l):
4747
m = 0
4848
s = i+1
4949
return bounds, max
50+
51+
52+
def merge_sort(l):
53+
"""Sort list using merge sort.
54+
55+
@param l list to sort.
56+
@returns sorted list.
57+
"""
58+
def merge(l1, l2):
59+
"""Merge sorted lists l1 and l2.
60+
61+
[1, 2, 4], [1, 3, 4, 5] -> [1, 1, 2, 3, 4, 5]
62+
@param l1 sorted list
63+
@param l2 sorted list
64+
@returns merge sorted list
65+
"""
66+
res = []
67+
i = 0
68+
j = 0
69+
while i < len(l1) and j < len(l2):
70+
if l1[i] <= l2[j]:
71+
res.append(l1[i])
72+
i += 1
73+
elif l2[j] < l1[i]:
74+
res.append(l2[j])
75+
j += 1
76+
77+
while i < len(l1):
78+
res.append(l1[i])
79+
i += 1
80+
81+
while j < len(l2):
82+
res.append(l2[j])
83+
j += 1
84+
85+
return res
86+
87+
length = len(l)
88+
if length <= 1:
89+
return l
90+
mid = length / 2
91+
h1 = merge_sort(l[:mid])
92+
h2 = merge_sort(l[mid:])
93+
94+
return merge(h1, h2)

algorithms/tests/test_list.py

+12
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,17 @@ def test_find_int_empty_list(self):
3333
idx = list.find_int(3, [])
3434
self.assertIsNone(idx)
3535

36+
def test_merge_sort(self):
37+
res = list.merge_sort([3, 4, 1, 5, 0])
38+
self.assertListEqual(res, [0, 1, 3, 4, 5])
39+
40+
def test_merge_sort_duplicates(self):
41+
res = list.merge_sort([3, 4, 1, 5, 0, 4])
42+
self.assertListEqual(res, [0, 1, 3, 4, 4, 5])
43+
44+
def test_merge_sort_single_element(self):
45+
res = list.merge_sort([3])
46+
self.assertListEqual(res, [3])
47+
3648
if __name__ == '__main__':
3749
unittest.main()

0 commit comments

Comments
 (0)