Skip to content

Commit 478a3f8

Browse files
committed
merger_sort and counting inversions
created merge sort and counting inversions
1 parent d449e72 commit 478a3f8

File tree

3 files changed

+124
-1
lines changed

3 files changed

+124
-1
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
# algorithms_python
2-
This repository have the python codes for various algorithmic problems
2+
This repository have the python codes for following algorithmic problems:
3+
1. Karatsuba Multiplier
4+
2. Merge Sort
5+
3. Counting Inversion: Counting number of Inversions to sort an array

counting_inversions.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
def count_the_inversion_by_brute_force(arr):
3+
"""
4+
The complexity of this merge_sort is n squared.
5+
Maximum inversions can occur when the list given is in reverse order.
6+
Number of maximum inversions for a list of size n is = nC2 = n(n+1)/2
7+
"""
8+
n = len(arr)
9+
count = 0
10+
for i in range(n):
11+
for j in range(i, n):
12+
if arr[i] > arr[j]:
13+
arr[i], arr[j] = arr[j], arr[i]
14+
count += 1
15+
print(arr)
16+
return count
17+
18+
19+
20+
def count_the_inversion_by_merge_sort(arr):
21+
"""
22+
The complexity of this merge_sort is nlogn.
23+
Maximum inversions can occur when the list given is in reverse order.
24+
Number of maximum inversions for a list of size n is = nC2 = n(n+1)/2
25+
"""
26+
n = len(arr)
27+
if n == 1:
28+
return arr, 0
29+
30+
c = [0]*n
31+
a, b = [], []
32+
if n%2 == 1:
33+
a = arr[0:(int(n/2)+1)]
34+
b = arr[(int(n/2)+1):]
35+
else:
36+
a = arr[0:(int(n/2))]
37+
b = arr[(int(n/2)):]
38+
39+
i, j = 0, 0
40+
a, c1 = count_the_inversion_by_merge_sort(a)
41+
b, c2 = count_the_inversion_by_merge_sort(b)
42+
43+
n1 = len(a)
44+
n2 = len(b)
45+
count = 0
46+
for k in range(n):
47+
if a[i] < b[j]:
48+
c[k] = a[i]
49+
i += 1
50+
elif a[i] > b[j]:
51+
c[k] = b[j]
52+
j += 1
53+
count += (n1-i)
54+
if i == n1:
55+
for s in range(j, n2):
56+
k += 1
57+
c[k] = b[s]
58+
break
59+
if j == n2:
60+
for s in range(i, n1):
61+
k += 1
62+
c[k] = a[s]
63+
break
64+
return c, count+c1+c2
65+
66+
67+
68+
arr = [6,1,3,5,2,4]
69+
print("Number of Inversions to sort the list: ", count_the_inversion_by_brute_force(arr))
70+
arr = [6,1,3,5,2,4]
71+
print("Number of Inversions to sort the list: ", count_the_inversion_by_merge_sort(arr)[1])

merge_sort.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
def merge_sort(arr):
3+
"""
4+
The complexity of this merge_sort is nlogn.
5+
"""
6+
n = len(arr)
7+
if n == 1:
8+
return arr
9+
10+
c = [0]*n
11+
a, b = [], []
12+
if n%2 == 1:
13+
a = arr[0:(int(n/2)+1)]
14+
b = arr[(int(n/2)+1):]
15+
else:
16+
a = arr[0:(int(n/2))]
17+
b = arr[(int(n/2)):]
18+
19+
i, j = 0, 0
20+
a = merge_sort(a)
21+
b = merge_sort(b)
22+
23+
n1 = len(a)
24+
n2 = len(b)
25+
26+
for k in range(n):
27+
if a[i] < b[j]:
28+
c[k] = a[i]
29+
i += 1
30+
elif a[i] > b[j]:
31+
c[k] = b[j]
32+
j += 1
33+
34+
if i == n1:
35+
for s in range(j, n2):
36+
k += 1
37+
c[k] = b[s]
38+
break
39+
if j == n2:
40+
for s in range(i, n1):
41+
k += 1
42+
c[k] = a[s]
43+
break
44+
return c
45+
46+
47+
48+
arr = [43, 19, 11,8,1,3,4,5,2,7,6, 10, 14, 0, 23]
49+
print(merge_sort(arr))

0 commit comments

Comments
 (0)