-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay 20: Sorting
More file actions
36 lines (30 loc) · 983 Bytes
/
Day 20: Sorting
File metadata and controls
36 lines (30 loc) · 983 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/python
import sys
def merge_sort(A):
if len(A) <= 1:
return 0, A
middle = len(A)/2
left_inversions, left = merge_sort(A[:middle])
right_inversions, right = merge_sort(A[middle:])
merge_inversions, merged = merge(left, right)
inversions = left_inversions + right_inversions + merge_inversions
return inversions, merged
def merge(left, right):
result = []
i, j, inversions = 0, 0, 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
inversions += j
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
inversions += j*(len(left)-i)
result += left[i:]
result += right[j:]
return inversions, result
n = int(raw_input().strip())
a = map(int,raw_input().strip().split(' '))
count, sa = merge_sort(a)
print 'Array is sorted in %s swaps.\nFirst Element: %s\nLast Element: %s'%(count,sa[0],sa[n-1])