count = 0
def merge_sort(li):
if len(li) < 2: return li
m = len(li) / 2
return merge(merge_sort(li[:m]), merge_sort(li[m:]))
def merge(l, r):
global count
result = []
i = j = 0
while i < len(l) and j < len(r):
if l[i] < r[j]:
result.append(l[i])
i += 1
else:
result.append(r[j])
count = count + (len(l) - i)
j += 1
result.extend(l[i:])
result.extend(r[j:])
return result
unsorted = [10,2,3,22,33,7,4,1,2]
print merge_sort(unsorted)
print count
Tell me more
×
Code Review Stack Exchange is a question and answer site for
peer programmer code reviews. It's 100% free, no registration required.
|
|||||||
|
Rather than a global count, I would suggest using either a parameter, or to return a tuple that keeps the count during each recursive call. This would also assure you thread safety.
Since l and r are copied in merge_sort, we can modify them without heart burn.
Counting is separate from the actual business of merge sort. So it is nicer to move it to a separate line.
Now, add what ever is left in the array
Use a mutable DS to simulate pass by reference.
|
||||
|
129 chars version including the file reading :)
|
||||