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)
Exemple #3
0
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
Exemple #4
0
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)