Skip to content

Instantly share code, notes, and snippets.

@boki1
Created September 30, 2020 13:41
Show Gist options
  • Save boki1/dde20e724b9e9b73ff569c8874f3166a to your computer and use it in GitHub Desktop.
Save boki1/dde20e724b9e9b73ff569c8874f3166a to your computer and use it in GitHub Desktop.
Python HW - Merge sort
from random import randint
def string_compare(s1, s2):
rv = len(s1) - len(s2)
# print(f'values: ({s1}, {s2}); {s1} > {s2} ? {rv}')
if rv > 0:
return 1
elif rv < 0:
return -1
else:
return 0
def int_compare(i1, i2):
rv = i1 - i2
# print(f'values: ({i1}, {i2}); {i1} > {i2} ? {rv}')
if rv > 0:
return 1
elif rv < 0:
return -1
else:
return 0
def merge_sort(arr, callback):
if len(arr) < 2:
return arr
mid = len(arr) // 2
left_part, right_part = arr[:mid], arr[mid:]
left_part = merge_sort(left_part, callback)
right_part = merge_sort(right_part, callback)
def merge(left_p, right_p, callback):
res = []
while len(left_p) > 0 and len(right_p) > 0:
rv = callback(left_p[0], right_p[0])
if rv == -1:
res.append(left_p.pop(0))
else:
res.append(right_p.pop(0))
res.extend(left_p)
res.extend(right_p)
return res
res = merge(left_part, right_part, callback)
return res
def test_ints():
passed_total = 0
failed = []
for _ in range(100):
lst_length = randint(-1000, +1001)
lst = []
for i in range(lst_length):
lst.append(randint(-1000, +1001))
lst_merge_sorted = merge_sort(lst, int_compare)
lst_std_sorted = sorted(lst)
if lst_merge_sorted == lst_std_sorted:
print(f"TEST {_} passed.")
passed_total += 1
else:
print(f"TEST {_} failed.")
print(f"\t lst: {lst}")
failed.append(lst)
print(f'\n\n\n Total passed: {passed_total}\n\n\n Total failed: {len(failed)}')
def main():
test_ints()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment