From 992bdae5cf9ea3cdc948c08fd674845d0b8f4a25 Mon Sep 17 00:00:00 2001 From: Maes <11432396+maesbrisa@users.noreply.github.com> Date: Mon, 5 Oct 2020 16:42:15 +0100 Subject: [PATCH 1/5] merge 2 sorted lists with simple tests --- sorting/merge2lists.py | 125 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 sorting/merge2lists.py diff --git a/sorting/merge2lists.py b/sorting/merge2lists.py new file mode 100644 index 0000000..a168d02 --- /dev/null +++ b/sorting/merge2lists.py @@ -0,0 +1,125 @@ + +def mergeboth(a, b): + ia, ib, ic = 0,0,0 + length = len(a) + len(b) + c = [] + if len(a) == 0: + print('----- Final result -----') + print(b) + print('------------------------') + return b + if len(b) == 0: + print('----- Final result -----') + print(a) + print('------------------------') + return a + while len(c) < length-1: + if a[ia] <= b[ib]: + print(str(a[ia]) + ' minor than ' + str(b[ib])) + if len(c) > 1 and a[ia] < c[-1]: + c.insert(-1, a[ia]) + else: + c.append(a[ia]) + c.append(b[ib]) + print('Current C array') + print(c) + else: + print(str(a[ia]) + ' major than ' + str(b[ib])) + if len(c) > 1 and b[ib] < c[-1]: + c.insert(-1, b[ib]) + else: + c.append(b[ib]) + c.append(a[ia]) + print('Current C array') + print(c) + if ia == len(a) -1: + if ib < len(b)-1: + print('there are elements left from: ' + str(ib) ) + print('elements left from ' + str(ib)) + print(b[ib+1:]) + c.extend(b[ib+1:]) + print('Check lengths') + print(length, len(c)) + else: + if ib == len(b)-1: + print('there are elements left from: ' + str(ia) ) + print('elements left from ' + str(ia)) + print(a[ia+1:]) + c.extend(a[ia+1:]) + print('Check lengths') + print(length, len(c)) + else: + ia += 1 + ib += 1 + print('----- Final result -----') + print(c) + print('------------------------') + return c + +def test1(): + print('starting test1') + a = [1,2,5,8,8] + b = [3,6,7,7] + assert mergeboth(a, b) == [1, 2, 3, 5, 6, 7, 7, 8, 8] + print('------------------------') + + +def test2(): + print('starting test2') + f = [1,4,6,8,9] + g = [2,5,7] + assert mergeboth(f,g) == [1, 2, 4, 5, 6, 7, 8, 9] + print('------------------------') + + +def test3(): + print('starting test3') + d = [2,6,8] + e = [1,7,9] + assert mergeboth(d,e) == [1, 2, 6, 7, 8, 9] + print('------------------------') + +def test4(): + print('starting test4') + a = [1,3,5,7] + b = [2,4,6] + assert mergeboth(a,b) == [1, 2, 3, 4, 5, 6, 7] + print('------------------------') + +def test5(): + print('starting test5') + a = [1,2,9] + b = [5,7,8] + assert mergeboth(a,b) == [1, 2, 5, 7, 8, 9] + print('------------------------') + +def test6(): + print('starting test6') + a = [1,2] + b = [] + assert mergeboth(a,b) == [1, 2] + print('------------------------') + +def test7(): + print('starting test7') + a = [] + b = [] + assert mergeboth(a,b) == [] + print('------------------------') + +def test8(): + print('starting test8') + a = [] + b = [1,2] + assert mergeboth(a,b) == [1, 2] + print('------------------------') + +if __name__ == "__main__": + test1() + test2() + test3() + test4() + test5() + test6() + test7() + test8() From 1a0a4bba5c48a9010413a86d5b91d59a690a09ef Mon Sep 17 00:00:00 2001 From: Maes <11432396+maesbrisa@users.noreply.github.com> Date: Mon, 5 Oct 2020 17:21:06 +0100 Subject: [PATCH 2/5] simplify indexes --- sorting/merge2lists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorting/merge2lists.py b/sorting/merge2lists.py index a168d02..500fcf2 100644 --- a/sorting/merge2lists.py +++ b/sorting/merge2lists.py @@ -1,6 +1,6 @@ def mergeboth(a, b): - ia, ib, ic = 0,0,0 + ia, ib = 0,0 length = len(a) + len(b) c = [] if len(a) == 0: From a3b215a53888cd042a77f921ad8c62e659e95c1b Mon Sep 17 00:00:00 2001 From: Maes <11432396+maesbrisa@users.noreply.github.com> Date: Mon, 5 Oct 2020 17:24:25 +0100 Subject: [PATCH 3/5] simplify indexes, now really --- sorting/merge2lists.py | 49 +++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/sorting/merge2lists.py b/sorting/merge2lists.py index 500fcf2..74a9682 100644 --- a/sorting/merge2lists.py +++ b/sorting/merge2lists.py @@ -1,6 +1,6 @@ def mergeboth(a, b): - ia, ib = 0,0 + index = 0 length = len(a) + len(b) c = [] if len(a) == 0: @@ -14,43 +14,42 @@ def mergeboth(a, b): print('------------------------') return a while len(c) < length-1: - if a[ia] <= b[ib]: - print(str(a[ia]) + ' minor than ' + str(b[ib])) - if len(c) > 1 and a[ia] < c[-1]: - c.insert(-1, a[ia]) + if a[index] <= b[index]: + print(str(a[index]) + ' minor than ' + str(b[index])) + if len(c) > 1 and a[index] < c[-1]: + c.insert(-1, a[index]) else: - c.append(a[ia]) - c.append(b[ib]) + c.append(a[index]) + c.append(b[index]) print('Current C array') print(c) else: - print(str(a[ia]) + ' major than ' + str(b[ib])) - if len(c) > 1 and b[ib] < c[-1]: - c.insert(-1, b[ib]) + print(str(a[index]) + ' major than ' + str(b[index])) + if len(c) > 1 and b[index] < c[-1]: + c.insert(-1, b[index]) else: - c.append(b[ib]) - c.append(a[ia]) + c.append(b[index]) + c.append(a[index]) print('Current C array') print(c) - if ia == len(a) -1: - if ib < len(b)-1: - print('there are elements left from: ' + str(ib) ) - print('elements left from ' + str(ib)) - print(b[ib+1:]) - c.extend(b[ib+1:]) + if index == len(a) -1: + if index < len(b)-1: + print('there are elements left from: ' + str(index) ) + print('elements left from ' + str(index)) + print(b[index+1:]) + c.extend(b[index+1:]) print('Check lengths') print(length, len(c)) else: - if ib == len(b)-1: - print('there are elements left from: ' + str(ia) ) - print('elements left from ' + str(ia)) - print(a[ia+1:]) - c.extend(a[ia+1:]) + if index == len(b)-1: + print('there are elements left from: ' + str(index) ) + print('elements left from ' + str(index)) + print(a[index+1:]) + c.extend(a[index+1:]) print('Check lengths') print(length, len(c)) else: - ia += 1 - ib += 1 + index += 1 print('----- Final result -----') print(c) print('------------------------') From 26e5c7c05a5d09f95ff38245814a36f152c72b4a Mon Sep 17 00:00:00 2001 From: Maes <11432396+maesbrisa@users.noreply.github.com> Date: Mon, 5 Oct 2020 19:30:01 +0100 Subject: [PATCH 4/5] first approach to merge sort algorith on my own because i think this can be a good idea --- sorting/mergesort.py | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 sorting/mergesort.py diff --git a/sorting/mergesort.py b/sorting/mergesort.py new file mode 100644 index 0000000..0be75eb --- /dev/null +++ b/sorting/mergesort.py @@ -0,0 +1,87 @@ + + +def divide(temp_list, unsorted_list): + print('entering divide') + if len(unsorted_list) == 1: + temp_list.append(unsorted_list) + else: + divide(temp_list, unsorted_list[len(unsorted_list)//2:]) + divide(temp_list, unsorted_list[:len(unsorted_list)//2]) + +def merge_both(a=[], b=[]): + index, length, c = 0, len(a) + len(b), [] + if len(a) == 0: + print('----- Final result -----') + print(b) + print('------------------------') + return b + if len(b) == 0: + print('----- Final result -----') + print(a) + print('------------------------') + return a + while len(sorted_list) < length-1: + if list_to_sort[index] <= b[index]: + print(str(a[index]) + ' minor than ' + str(b[index])) + if len(c) > 1 and a[index] < c[-1]: + c.insert(-1, a[index]) + else: + c.append(a[index]) + c.append(b[index]) + print('Current C array') + print(c) + else: + print(str(a[index]) + ' major than ' + str(b[index])) + if len(c) > 1 and b[index] < c[-1]: + c.insert(-1, b[index]) + else: + c.append(b[index]) + c.append(a[index]) + print('Current C array') + print(c) + if index == len(a) -1: + if index < len(b)-1: + print('there are elements left from: ' + str(index) ) + print('elements left from ' + str(index)) + print(b[index+1:]) + c.extend(b[index+1:]) + print('Check lengths') + print(length, len(c)) + else: + if index == len(b)-1: + print('there are elements left from: ' + str(index) ) + print('elements left from ' + str(index)) + print(a[index+1:]) + c.extend(a[index+1:]) + print('Check lengths') + print(length, len(c)) + else: + index += 1 + print('----- Final result -----') + print(c) + print('------------------------') + return c + +def merge(list_to_sort, length): + print('entering merge') + index, sorted_list = 0, [] + print(list_to_sort) + for i in range(0, len(sorted_list), 2): + print('enter for loop') + if i+1 < len(sorted_list)-1: + print('merging both') + merge_both(sorted_list[i], sorted_list[i+1]) + else: + print('we reached final elements') + merge_both(sorted_list[i], []) + return sorted_list + + + + +if __name__ == '__main__': + temp_list = [] + list_to_sort = [5,4,2,7,9,1] + divide(temp_list, list_to_sort) + print(temp_list) + merge(temp_list, len(list_to_sort)) From 9c7ba1abf13290385b58dfa327a48e1d543fc138 Mon Sep 17 00:00:00 2001 From: Maes <11432396+maesbrisa@users.noreply.github.com> Date: Mon, 5 Oct 2020 20:25:54 +0100 Subject: [PATCH 5/5] using indexes and modifying the original list --- sorting/mergesort.py | 115 +++++++++++++------------------------------ 1 file changed, 35 insertions(+), 80 deletions(-) diff --git a/sorting/mergesort.py b/sorting/mergesort.py index 0be75eb..da13d58 100644 --- a/sorting/mergesort.py +++ b/sorting/mergesort.py @@ -1,87 +1,42 @@ -def divide(temp_list, unsorted_list): +def merge_sort(original_list): print('entering divide') - if len(unsorted_list) == 1: - temp_list.append(unsorted_list) - else: - divide(temp_list, unsorted_list[len(unsorted_list)//2:]) - divide(temp_list, unsorted_list[:len(unsorted_list)//2]) - -def merge_both(a=[], b=[]): - index, length, c = 0, len(a) + len(b), [] - if len(a) == 0: - print('----- Final result -----') - print(b) - print('------------------------') - return b - if len(b) == 0: - print('----- Final result -----') - print(a) - print('------------------------') - return a - while len(sorted_list) < length-1: - if list_to_sort[index] <= b[index]: - print(str(a[index]) + ' minor than ' + str(b[index])) - if len(c) > 1 and a[index] < c[-1]: - c.insert(-1, a[index]) - else: - c.append(a[index]) - c.append(b[index]) - print('Current C array') - print(c) - else: - print(str(a[index]) + ' major than ' + str(b[index])) - if len(c) > 1 and b[index] < c[-1]: - c.insert(-1, b[index]) - else: - c.append(b[index]) - c.append(a[index]) - print('Current C array') - print(c) - if index == len(a) -1: - if index < len(b)-1: - print('there are elements left from: ' + str(index) ) - print('elements left from ' + str(index)) - print(b[index+1:]) - c.extend(b[index+1:]) - print('Check lengths') - print(length, len(c)) - else: - if index == len(b)-1: - print('there are elements left from: ' + str(index) ) - print('elements left from ' + str(index)) - print(a[index+1:]) - c.extend(a[index+1:]) - print('Check lengths') - print(length, len(c)) + if len(original_list) > 1: + middle_index = len(original_list)//2 + left = original_list[:middle_index] + right = original_list[middle_index:] + merge_sort(left) + merge_sort(right) + print('i am back!') + left_index, right_index, original_index = 0, 0, 0 + while left_index < len(left) and right_index < len(right): + if left[left_index] <= right[right_index]: + original_list[original_index] = left[left_index] + left_index += 1 else: - index += 1 - print('----- Final result -----') - print(c) - print('------------------------') - return c - -def merge(list_to_sort, length): - print('entering merge') - index, sorted_list = 0, [] - print(list_to_sort) - for i in range(0, len(sorted_list), 2): - print('enter for loop') - if i+1 < len(sorted_list)-1: - print('merging both') - merge_both(sorted_list[i], sorted_list[i+1]) - else: - print('we reached final elements') - merge_both(sorted_list[i], []) - return sorted_list - - - + original_list[original_index] = right[right_index] + right_index += 1 + original_index += 1 + print('we have just put two values in order from both halves') + print(right[right_index-1], left[left_index-1]) + + while left_index < len(left): + print('this means that right half is out of stock') + print(right, right_index, left, left_index) + original_list[original_index] = left[left_index] + left_index += 1 + original_index += 1 + + while right_index < len(right): + print('this means that left half is out of stock') + print(right, right_index, left, left_index) + original_list[original_index] = right[right_index] + right_index += 1 + original_index += 1 if __name__ == '__main__': - temp_list = [] list_to_sort = [5,4,2,7,9,1] - divide(temp_list, list_to_sort) - print(temp_list) - merge(temp_list, len(list_to_sort)) + merge_sort(list_to_sort) + print('now sorted') + print(list_to_sort)