您的位置:首页 > 产品设计 > UI/UE

Divide and Conquer~ 计算inversions

2014-11-21 10:24 211 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: