The code is built on piggybacking on Merge Sort:
x = 0
def mergesort(arr):
global x
if len(arr) == 1:
return arr
else:
mid = len(arr) / 2
left = mergesort(arr[:mid])
right = mergesort(arr[mid:])
left_cnt, right_cnt, arr_cnt = 0, 0, 0
while left_cnt < len(left) and right_cnt < len(right):
if left[left_cnt] < right[right_cnt]:
arr[arr_cnt] = left[left_cnt]
left_cnt += 1
else:
arr[arr_cnt] = right[right_cnt]
right_cnt += 1; x += (len(left) - left_cnt) ##this is the only difference~!
arr_cnt += 1
while left_cnt < len(left):
arr[arr_cnt] = left[left_cnt]
left_cnt += 1; arr_cnt += 1
while right_cnt < len(right):
arr[arr_cnt] = right[right_cnt]
right_cnt += 1; arr_cnt += 1;
return arr
def main():
arr = []
fname = raw_input('please enter the filename:')
fhand = open(fname)
for line in fhand:
line.rstrip()
arr.append(int(line))
mergesort(arr)
print 'x is the number of inversions in the array: '
print x
main()