Skip to content

Commit 06bb74d

Browse files
Added mergesort like for counting inversions between two arrays
1 parent 2d07de1 commit 06bb74d

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
def merge_sort(array):
2+
total_inversions = 0
3+
if len(array) <= 1:
4+
return (array,0)
5+
6+
midpoint = int(len(array) / 2)
7+
8+
(left, left_inversions) = merge_sort(array[:midpoint])
9+
(right, right_inversions) = merge_sort(array[midpoint:])
10+
(merged_array, merge_inversions) = merge_and_count(left, right)
11+
12+
return (merged_array, left_inversions + right_inversions + merge_inversions)
13+
14+
def merge_and_count(left, right):
15+
count_inversions = 0
16+
result = []
17+
left_pointer = right_pointer = 0
18+
left_len = len(left)
19+
right_len = len(right)
20+
21+
while left_pointer < len(left) and right_pointer < len(right):
22+
if left[left_pointer] <= right[right_pointer]:
23+
result.append(left[left_pointer])
24+
left_pointer += 1
25+
26+
elif right[right_pointer] < left[left_pointer]:
27+
count_inversions += (left_len - left_pointer)
28+
result.append(right[right_pointer])
29+
right_pointer += 1
30+
31+
result.extend(left[left_pointer:])
32+
result.extend(right[right_pointer:])
33+
34+
return (result, count_inversions)
35+
36+
if __name__ == "__main__":
37+
array = [9, 2, 1, 5, 2, 3, 5, 1, 2, 32, 12, 11]
38+
print(array)
39+
40+
result = merge_sort(array)
41+
print(result)

0 commit comments

Comments
 (0)