import math
def merge(a, aux, lo, mid, hi):
assert isSorted(a, lo, mid)
assert isSorted(a, mid+1, hi)
for k in range(lo, hi+1):
aux[k] = a[k]
i, j = lo, mid + 1
for k in range(lo, hi+1):
print("i = ",i, ", j = ",j)
if i > mid:
a[k] = aux[j]
j += 1
elif j > hi:
a[k] = aux[i]
i += 1
elif aux[i] < aux[j]:
a[k] = aux[i]
i += 1
else:
a[k] = aux[j]
j += 1
assert isSorted(a, lo, hi)
def sort(a, aux, lo, hi):
if (lo >= hi): return a
mid = math.floor(lo + (hi-lo) / 2)
sort(a, aux, lo, mid)
sort(a, aux, mid+1, hi)
merge(a, aux, lo, mid, hi)
def merge_sort(a):
aux = [0] * len(a)
sort(a, aux, 0, len(a)-1)
assert isSortedArray(a)
def isSorted(a, lo, hi):
for i in range(lo, hi):
if a[i+1] < a[i]:
return False
return True
def isSortedArray(a):
for i in range(0, len(a)-1):
if a[i+1] < a[i]:
return False
return True
data = [11,1,5,7,9,11,2,3,4,6,0,10]
print data
try:
merge_sort(data)
except Exception as err:
print "Exception in user code: ", err
print data
aW1wb3J0IG1hdGgKCmRlZiBtZXJnZShhLCBhdXgsIGxvLCBtaWQsIGhpKToKICAgIGFzc2VydCBpc1NvcnRlZChhLCBsbywgbWlkKQogICAgYXNzZXJ0IGlzU29ydGVkKGEsIG1pZCsxLCBoaSkKCiAgICBmb3IgayBpbiByYW5nZShsbywgaGkrMSk6CiAgICAgICAgYXV4W2tdID0gYVtrXQoKICAgIGksIGogPSBsbywgbWlkICsgMQogICAgZm9yIGsgaW4gcmFuZ2UobG8sIGhpKzEpOgogICAgICAgIHByaW50KCJpID0gIixpLCAiLCBqID0gIixqKQogICAgICAgIGlmIGkgPiBtaWQ6CiAgICAgICAgICAgIGFba10gPSBhdXhbal0KICAgICAgICAgICAgaiArPSAxCiAgICAgICAgZWxpZiBqID4gaGk6CiAgICAgICAgICAgIGFba10gPSBhdXhbaV0KICAgICAgICAgICAgaSArPSAxCiAgICAgICAgZWxpZiBhdXhbaV0gPCBhdXhbal06CiAgICAgICAgICAgIGFba10gPSBhdXhbaV0KICAgICAgICAgICAgaSArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYVtrXSA9IGF1eFtqXQogICAgICAgICAgICBqICs9IDEKICAgIGFzc2VydCBpc1NvcnRlZChhLCBsbywgaGkpICAgIAoKZGVmIHNvcnQoYSwgYXV4LCBsbywgaGkpOgogICAgaWYgKGxvID49IGhpKTogcmV0dXJuIGEKICAgIG1pZCA9IG1hdGguZmxvb3IobG8gKyAoaGktbG8pIC8gMikKCiAgICBzb3J0KGEsIGF1eCwgbG8sIG1pZCkKICAgIHNvcnQoYSwgYXV4LCBtaWQrMSwgaGkpCiAgICBtZXJnZShhLCBhdXgsIGxvLCBtaWQsIGhpKQoKZGVmIG1lcmdlX3NvcnQoYSk6CiAgICBhdXggPSBbMF0gKiBsZW4oYSkKICAgIHNvcnQoYSwgYXV4LCAwLCBsZW4oYSktMSkKICAgIGFzc2VydCBpc1NvcnRlZEFycmF5KGEpCgpkZWYgaXNTb3J0ZWQoYSwgbG8sIGhpKToKICAgIGZvciBpIGluIHJhbmdlKGxvLCBoaSk6CiAgICAgICAgaWYgYVtpKzFdIDwgYVtpXToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKZGVmIGlzU29ydGVkQXJyYXkoYSk6CiAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYSktMSk6CiAgICAgICAgaWYgYVtpKzFdIDwgYVtpXToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQogICAgCgpkYXRhID0gWzExLDEsNSw3LDksMTEsMiwzLDQsNiwwLDEwXQpwcmludCBkYXRhCnRyeToKICAgIG1lcmdlX3NvcnQoZGF0YSkKZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CglwcmludCAiRXhjZXB0aW9uIGluIHVzZXIgY29kZTogIiwgZXJyCgpwcmludCBkYXRhCg==