def merge(left, right): result = DoubleLinkedList() print("<<< entering merge...") print( f"<<< before while, left is {left.begin}, and right is {right.begin}.") while left is not None and right is not None: # while both slists are not empty print(f"<<< enter while - left=", left.begin, "right=", right.begin) if left.begin.value <= right.begin.value: print("<<< if-branch: left=", left.begin, "right=", right.begin) result.push(left.unshift()) print("<<< result=", result.dump("result")) else: print("<<< else-branch: left=", left.begin, "right=", right.begin) result.shift(right.unshift()) print("<<< result=", result.dump("result")) print( f"<<< after 1st while - left is {left.begin}, and right is {right.begin}." ) print("<<< result=", result) while left: result.shift(left.unshift()) while right: result.shift(right.unshift()) return result
def merge_sort(dllist: DoubleLinkedList) -> DoubleLinkedList: # if dllist.count() == 1: if dllist.begin.next == None: print(">>> base case: dllist=", dllist.dump("base case")) return dllist left = DoubleLinkedList() # using new dllist to copy each smaller list right = DoubleLinkedList() middle = dllist.count() // 2 print(">>> middle=", middle) lsize = middle print(">>> lsize=", lsize) rsize = dllist.count() - middle print(">>> rsize=", rsize) copy_sublist(dllist, left, lsize) copy_sublist(dllist, right, rsize) left = merge_sort(left) print(">>> ", left.dump("left=")) right = merge_sort(right) print(">>> will this even run? right=", right.dump("right=")) return merge(left, right)
def random_dll_list(count): numbers = DoubleLinkedList() for i in range(count, 0, -1): # print(i) numbers.shift(randint(0, 10000)) numbers.dump() return numbers
def random_list(count): numbers = DoubleLinkedList() for i in range(count): numbers.push( randint(1, 100) ) numbers.dump("after random_list()") return numbers
def main(): number = randint(5, 10) start_list = DoubleLinkedList() left = DoubleLinkedList() right = DoubleLinkedList() for i in range(number): start_list.push(randint(0, 10)) start_list.dump("start list initialized.") lsize = start_list.count() print("\nlsize is: ", lsize) mid = lsize // 2 print("\nmid is: ", mid) left_size = mid right_size = lsize - mid print(f"\nThe length of left is {left_size} & right is {right_size}.") # copy half of the list into left # i = 0 # while i < mid: # nodeval = start_list.unshift() # left.push(nodeval) # i += 1 # replace above while block with a function call: copy_sublist(start_list, left, mid) start_list.dump("start after left copy") left.dump("left after copying from start") j = 0 while j < right_size: # print(">>> start of while: j is", j, " and right_size is", right_size) nodeval = start_list.unshift() # print(">>> nodeval is ", nodeval) right.push(nodeval) # right.dump(f"right at {j} is ") j += 1 print() start_list.dump("start after right copy") print() right.dump("right after copying from start") print()
def merge_sort(list): print("merge_sort") list_n = list.count() if (list_n <= 1): return _left = DoubleLinkedList() _right = DoubleLinkedList() for i in range(0, 1, int(list_n/2)): _left.push(list.pop()) for i in range(int(list_n/2), 1, list_n): _right.push(list.pop()) _left.dump("before__call_sub_______LEFT") merge_sort(_left) _right.dump("before__call_sub_______RIGHT") merge_sort(_right) list = merge(_left, _right)